23

在 Perl 正则表达式中,您可以用\Qand\E将子表达式括起来,表示您希望该子表达式作为文字字符串匹配,即使其中有元字符。您还具有quotemeta在字符串中插入正确数量的反斜杠的函数,因此如果您随后将该字符串插入到正则表达式中,无论其内容是什么,它都会按字面意思匹配。

Javascript(部署在主要浏览器中)是否有任何内置的等效项?我可以自己写,但我想知道我是否不必费心。

4

3 回答 3

19

没有这样的内置功能。

我建议您不要自己实现,而是查看互联网上可用的大量正则表达式转义函数。

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

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

或建议使用XRegExp库。

于 2011-06-11T21:47:43.290 回答
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

于 2011-06-11T21:50:58.327 回答
2

还有一个quotemeta npm 模块,您可以在 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模​​块并指出不需要捕获括号,因此正则表达式可以进一步简化如下:

String(str).replace(/\W/g, '\\$&');
于 2014-08-20T15:08:15.197 回答