Javascript相当于Perl的\ Q ... \ E或quotemeta()

时间:2011-06-11 21:43:27

标签: javascript regex quotemeta

在Perl正则表达式中,您可以使用\Q\E包围子表达式,以指示您希望将子表达式匹配为文字字符串,即使其中存在元字符。你还有quotemeta函数在字符串中插入正确数量的反斜杠,这样如果你随后将该字符串插入到正则表达式中,它将按字面意思匹配,无论其内容是什么。

Javascript(在主流浏览器中部署)是否具有内置等效内容?我可以自己写好,但我想知道我是否不必打扰。

3 个答案:

答案 0 :(得分:16)

没有这样的内置功能。<​​/ p>

我建议您研究互联网上可用的众多regex escape functions,而不是实现自己的。

该页面提出了以下解决方案(Colin Snover):

RegExp.escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}

或建议使用XRegExp库。

答案 1 :(得分:6)

就我所知,Quotemeta本身并没有实现,但几个月前我就用这个来实现这个目的:

function quotemeta (str) {
  // http://kevin.vanzonneveld.net
  // +   original by: Paulo Freitas
  // *     example 1: quotemeta(". + * ? ^ ( $ )");
  // *     returns 1: '\. \+ \* \? \^ \( \$ \)'
  return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1');
}

来自http://phpjs.org/functions/quotemeta:496

答案 2 :(得分:1)

还有一个quotemeta npm module,您可以在node.js或浏览器中使用它。实现是引用所有非单词字符,([^a-zA-Z0-9_]的缩写)。

String(str).replace(/(\W)/g, '\\$1');

这是有效的,因为所有需要转义的字符都是非单词,而其他结束转义的字符则无害。例如,这里百分比字符被转义,但它仍然在RegExp中正常匹配,尽管它不需要转义:

if ("Hello%".match(RegExp(String("%").replace(/(\W)/g,'\\$1')))) { console.log("matched!"); } 

```

有人分叉了quotemeta模块并注意到不需要捕获的parens,因此可以进一步简化正则表达式:

String(str).replace(/\W/g, '\\$&');