在 Perl 正则表达式中,您可以用\Q
and\E
将子表达式括起来,表示您希望该子表达式作为文字字符串匹配,即使其中有元字符。您还具有quotemeta
在字符串中插入正确数量的反斜杠的函数,因此如果您随后将该字符串插入到正则表达式中,无论其内容是什么,它都会按字面意思匹配。
Javascript(部署在主要浏览器中)是否有任何内置的等效项?我可以自己写,但我想知道我是否不必费心。
在 Perl 正则表达式中,您可以用\Q
and\E
将子表达式括起来,表示您希望该子表达式作为文字字符串匹配,即使其中有元字符。您还具有quotemeta
在字符串中插入正确数量的反斜杠的函数,因此如果您随后将该字符串插入到正则表达式中,无论其内容是什么,它都会按字面意思匹配。
Javascript(部署在主要浏览器中)是否有任何内置的等效项?我可以自己写,但我想知道我是否不必费心。
没有这样的内置功能。
我建议您不要自己实现,而是查看互联网上可用的大量正则表达式转义函数。
该页面提出了以下解决方案(由Colin Snover 提供):
RegExp.escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
或建议使用XRegExp库。
据我所知,Quotemeta 并没有原生实现,但几个月前我已经使用它来实现这一点:
function quotemeta (str) {
// http://kevin.vanzonneveld.net
// + original by: Paulo Freitas
// * example 1: quotemeta(". + * ? ^ ( $ )");
// * returns 1: '\. \+ \* \? \^ \( \$ \)'
return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1');
}
还有一个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, '\\$&');