鉴于这一功能:
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
到以下内容,然后在浏览器替换什么:
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”(这不可能发现)。
就个人而言,我不是正则表达式构建的使用字符串这个原因的大风扇。 逃离那个的关卡的需要可能导致你喝酒。 我相信其他人会有不同的感受,但并喜欢写的正则表达式时饮用。
在解释模式而言,有以下几种形式之间没有什么区别:
-
/pattern/
-
new RegExp("pattern")
如果你想使用替换文本字符串replace
的方法,我想你可以只传递一个字符串,而不是一个正则表达式来replace
。
否则,你就必须先逃脱模式中的任何正则表达式特殊字符 - 也许像这样:
function reEscape(s) {
return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}
// ...
var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);
你的正则表达式应该有摹修改:
var pattern = /[somepattern]+/g;
通知在最后的克。 它告诉替代品做全局替换。
你也不需要使用RegExp对象就可以构造如上面的图案。 实施例图案:
var pattern = /[0-9a-zA-Z]+/g;
的图案总是由/两边包围 - 与改性剂之后的最终/时,克改性剂是全球。
编辑:为什么它很重要,如果图案是变量? 在你的情况下,将功能类似这样(注意,模式仍然是一个变量):
var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");
但是,你需要改变你的替换功能,以这样的:
this.markup = this.markup.replace(pattern, value);