2011-06-11 43 views
15

在Perl正则表达式中,您可以围绕一个子表达式\Q\E来指示您希望该子表达式作为文字字符串进行匹配,即使存在那里有元字符。您还有quotemeta函数,它可以在一个字符串中正确插入正确数量的反斜杠,这样,如果随后将该字符串插入正则表达式中,则无论其内容如何,​​它都将按字面顺序匹配。Javascript等价于Perl的 Q ... E或quotemeta()

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

回答

14

没有这样的内置功能。

而不是实现你自己的,我建议你看看互联网上提供的众多regex escape functions

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

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

或建议使用XRegExp库。

+3

谢谢。请注意任何点击链接的人:请阅读底部的*正确*版本的例程。 – zwol 2011-06-13 17:19:20

5

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

+0

爱好漂亮直截了当的执行 – ZJR 2012-02-01 01:55:36

1

还有一个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, '\\$&'); 
+1

请注意,这将打破代理对中间反斜杠分开,破坏字符,如 – Kovensky 2016-11-17 12:11:01

+0

如果有解决方案,请提交一个PR到quotemeta模块并编辑这个答案。 – 2016-11-17 15:33:41

相关问题