如何在JavaScript中逃避正则expression式?

我有这样的代码:

pattern = 'arrayname[1]'; // fetch from dom, make literal here just for example reg = new RegExp(RegExp.quote(pattern), 'g'); mystring.replace(reg, 'arrayname[2]'); 

但它失败,并显示错误消息:“RegExp.quote不是函数”。

我错过了一些简单的东西吗

这个问题让我在Google上searchJavaScript中的RegEx.quote函数,这是我不知道的。 事实certificate,这个函数只存在于一个地方,即在StackOverflow的Gracenote的回答里 。 该function是这样定义的:

 RegExp.quote = function(str) { return (str+'').replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"); }; 

如果你想使用这个函数,你需要在脚本上面的某个地方加上上面的定义。

如果你直接replace,你不需要一个正则expression式:

 str = str.split(search).join(replace) 

从mozilla开发文档

 function escapeRegExp(string){ return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } 

这是不寻常的,但在这种特殊情况下,我会创build一个这样的function

 RegExp.escape = function(str) { return String(str).replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); }; 

用法

 new RegExp(RegExp.escape('http://www.google.com')); //=> /http\:\/\/www\.google\.com/ 

这里是Google的闭包库使用的确切函数。

 /** * Escapes characters in the string that are not safe to use in a RegExp. * @param {*} s The string to escape. If not a string, it will be casted * to one. * @return {string} A RegExp safe, escaped copy of {@code s}. */ goog.string.regExpEscape = function(s) { return String(s).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1'). replace(/\x08/g, '\\x08'); }; 

请参阅链接

 var easiest = any_string.replace(/\W/g, "\\$&"); 

编辑:

为什么我应该记住哪些字符有特殊的含义,甚至使用一个function,如果逃避任何非单词字符是足够的?

我的解决scheme是没有道理的,也许这就是为什么它被拒绝投票。 :d

Mozillabuild议使用这个函数来使用正则expression式中的字符:

 function escapeRegExp(string){ return string.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1"); } 

你可以在Mozilla Javascript Guide的本章最后find这个: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_Special_Characters

以前的答案逃脱太多字符。

根据什么特殊字符必须在正则expression式中转义? ,只有下列字符需要转义:

  • .^$*+?()[{\| 外面的字符类。
  • ^-]\里面的字符类。

然后,这个函数做的诀窍:

 function escapeRegExp(str) { return str.replace(/[.^$*+?()[{\\|\]-]/g, '\\$&'); } 

那么,首先你可以用自己的常量语法定义正则expression式:

 var reg = /arrayname\[1\]/; 

在正则expression式里面用反斜杠引用。 现在,如果你从一个string开始,你必须“保护”string常量内的反斜杠。 在这种情况下,该模式被parsing两次 :一次,当string常量被Javascriptparsing器吞噬,然后一次由RegExp构造函数:

 var pattern = "arrayname\\[1\\]"; var reg = new RegExp(pattern); 

反斜杠加倍,以便string“模式”将看起来像我的第一个示例中的正则expression式 – 每个括号字符之前一个反斜杠。