如何在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式 – 每个括号字符之前一个反斜杠。