鉴于此功能:
function Repeater(template) {
var repeater = {
markup: template,
replace: function(pattern, value) {
this.markup = this.markup.replace(pattern, value);
}
};
return repeater;
};
如何使 this.markup.replace()
全局替换?这就是问题所在。如果我这样使用它:
alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);
警报的值为“foobar $TEST_ONE”。
如果我将 Repeater
更改为以下内容,则 Chrome 中没有任何内容被替换:
function Repeater(template) {
var repeater = {
markup: template,
replace: function(pattern, value) {
this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
}
};
return repeater;
};
...并且警报是 $TEST_ONE $TEST_ONE
。
您需要双重转义任何正则表达式字符(一次用于字符串中的斜线,一次用于正则表达式):
"$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")
否则,它会查找行尾和“TESTONE”(它永远找不到)。
就个人而言,出于这个原因,我不太喜欢使用字符串构建正则表达式。所需的逃逸程度可能会导致您喝酒。我敢肯定,其他人的感受会有所不同,并且在编写正则表达式时喜欢喝酒。
在模式解释方面,以下形式没有区别:
/图案/
新的正则表达式(“模式”)
如果您想使用 replace
方法替换文字字符串,我认为您可以将字符串而不是正则表达式传递给 replace
。
否则,您必须首先转义模式中的任何正则表达式特殊字符 - 可能像这样:
function reEscape(s) {
return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}
// ...
var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);
您的正则表达式模式应该具有 g 修饰符:
var pattern = /[somepattern]+/g;
注意最后的 g。它告诉替换者进行全局替换。
此外,您不需要使用 RegExp 对象,您可以如上所述构建您的模式。示例模式:
var pattern = /[0-9a-zA-Z]+/g;
一个模式总是在两边被 / 包围——在最后一个 / 之后有修饰符,g 修饰符是全局的。
编辑:如果模式是变量,为什么重要?在你的情况下,它会像这样运行(注意模式仍然是一个变量):
var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");
但是您需要将替换功能更改为:
this.markup = this.markup.replace(pattern, value);
/pattern/
或new RegExp("pattern")
不会有什么不同。