在Perl正则表达式中,您可以围绕一个子表达式\Q
和\E
来指示您希望该子表达式作为文字字符串进行匹配,即使存在那里有元字符。您还有quotemeta
函数,它可以在一个字符串中正确插入正确数量的反斜杠,这样,如果随后将该字符串插入正则表达式中,则无论其内容如何,它都将按字面顺序匹配。Javascript等价于Perl的 Q ... E或quotemeta()
Javascript(如在主流浏览器中部署)是否有任何内置等效?我可以写我自己的很好,但我想知道如果我不必打扰。
在Perl正则表达式中,您可以围绕一个子表达式\Q
和\E
来指示您希望该子表达式作为文字字符串进行匹配,即使存在那里有元字符。您还有quotemeta
函数,它可以在一个字符串中正确插入正确数量的反斜杠,这样,如果随后将该字符串插入正则表达式中,则无论其内容如何,它都将按字面顺序匹配。Javascript等价于Perl的 Q ... E或quotemeta()
Javascript(如在主流浏览器中部署)是否有任何内置等效?我可以写我自己的很好,但我想知道如果我不必打扰。
没有这样的内置功能。
而不是实现你自己的,我建议你看看互联网上提供的众多regex escape functions。
该页面提出如下解决方案(由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');
}
爱好漂亮直截了当的执行 – ZJR 2012-02-01 01:55:36
还有一个quotemeta npm module,你可以在node.js或浏览器中使用。实现是引用所有非单词字符(简写为[^a-zA-Z0-9_]
)。
String(str).replace(/(\W)/g, '\\$1');
这是可行的,因为所有需要转义的字符都是非单词,而其他转义字符则无害。例如,这里百分号被逃了出来,但它仍然正常匹配的正则表达式,但它并不需要进行转义:
if ("Hello%".match(RegExp(String("%").replace(/(\W)/g,'\\$1')))) { console.log("matched!"); }
```
有人分叉的quotemeta
模块注意,捕获parens是不需要的,所以正则表达式可以进一步简化如下:
String(str).replace(/\W/g, '\\$&');
请注意,这将打破代理对中间反斜杠分开,破坏字符,如 – Kovensky 2016-11-17 12:11:01
如果有解决方案,请提交一个PR到quotemeta模块并编辑这个答案。 – 2016-11-17 15:33:41
谢谢。请注意任何点击链接的人:请阅读底部的*正确*版本的例程。 – zwol 2011-06-13 17:19:20