2009-07-22 104 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);