2009-07-22 118 views
72

鉴于这一功能: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

回答

102

你需要加倍逃避任何正则表达式的字符(一次字符串中的斜线和一次正则表达式):

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

否则,它会寻找行的结束和“TESTONE”(其它从来没有发现)。由于这个原因,我个人不喜欢构建正则表达式的字符串。需要逃跑的程度可能导致你喝酒。我相信其他人在写正则表达式时会感觉不同,并且喜欢喝酒。

+0

但替换()接收的正则表达式作为变量。 – core 2009-07-22 01:05:38

+0

小修正 - `$`表示正则表达式中的行尾。 – harto 2009-07-22 01:12:19

21

你的正则表达式应该有摹修改:

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); 
55

在图案演绎方面,有以下几种形式之间没有什么区别:

  • /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);