在Perl正则表达式中,您可以使用\Q
和\E
包围子表达式,以指示您希望将子表达式匹配为文字字符串,即使其中存在元字符。你还有quotemeta
函数在字符串中插入正确数量的反斜杠,这样如果你随后将该字符串插入到正则表达式中,它将按字面意思匹配,无论其内容是什么。
Javascript(在主流浏览器中部署)是否具有内置等效内容?我可以自己写好,但我想知道我是否不必打扰。
答案 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');
}
答案 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, '\\$&');