JavaScript 替换/正则表达式

鉴于这一功能:

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

401252 次浏览

您需要对任何 RegExp 字符进行双重转义(一次用于字符串中的斜杠,一次用于 RegExp) :

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")

否则,它寻找行尾和“ TESTONE”(它从未找到)。

就个人而言,由于这个原因,我不太喜欢使用字符串构建 regexp。逃跑的程度可能会导致你喝酒。我相信其他人在写正则表达式时会有不同的感觉,喜欢喝酒。

正则表达式模式应该有 g 修饰符:

var pattern = /[somepattern]+/g;

注意最后的 g,它告诉替代者做一个全局替换。

你也不需要使用 RegExp 对象,你可以像上面一样构建你的模式。例子模式:

var pattern = /[0-9a-zA-Z]+/g;

一个模式总是被/包围着-在 final/后面加上修饰符,g 修饰符是全局的。

编辑: 如果模式是一个变量,为什么它很重要?在您的例子中,它的功能是这样的(注意,模式仍然是一个变量) :

var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");

但是您需要将替换函数更改为:

this.markup = this.markup.replace(pattern, value);

在模式解释方面,下列形式之间没有区别:

  • /pattern/
  • new RegExp("pattern")

如果希望使用 replace方法替换文本字符串,我认为可以直接向 replace传递字符串而不是 regexp。

否则,您必须首先转义模式中的任何 regexp 特殊字符——可能是这样:

function reEscape(s) {
return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1");
}


// ...


var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);