JavaScriptreplace/正则expression式

鉴于这个function:

function Repeater(template) { var repeater = { markup: template, replace: function(pattern, value) { this.markup = this.markup.replace(pattern, value); } }; return repeater; }; 

我如何使this.markup.replace()全局replace? 这是问题。 如果我这样使用它:

 alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup); 

警报的值是“foobar $ TEST_ONE”。

如果我将Repeater更改为以下内容,则Chrome中没有任何内容被replace:

 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

您需要将任何RegExp字符(一次用于string中的斜杠,一次用于正则expression式)加倍转义:

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

否则,它会查找行结束和“TESTONE”(它永远不会find)。

就个人而言,我不是build立正则expression式使用string的一个很大的粉丝。 需要逃跑的程度可能会导致你喝酒。 我相信其他人在写正则expression式时会觉得不一样,而且喜欢喝酒。

在模式解释方面,下列forms没有区别:

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

如果你想用replace方法replace一个文字string,我认为你可以传递一个string,而不是一个正则expression式来replace

否则,你将不得不逃脱模式中的任何正则expression式特殊字符 – 也许是这样的:

 function reEscape(s) { return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1"); } // ... var re = new RegExp(reEscape(pattern), "mg"); this.markup = this.markup.replace(re, value); 

您的正则expression式模式应该有g修饰符:

 var pattern = /[somepattern]+/g; 

注意最后的g。 它告诉替代者做全球replace。

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

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

一个模式总是围绕着/在任何一方 – 在最后的修饰符之后,g修饰符是全局的。

编辑:如果模式是一个variables,为什么它重要? 在你的情况下,它会像这样工作(注意模式仍然是一个variables):

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

但是你需要改变你的replacefunction:

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