2009-01-28 87 views
42

可能重複:
Escape string for use in Javascript regex傳遞變量爲正則表達式中的JavaScript

我有這樣一個消息:

最大{0}字符允許{ 1}

而且我有一個函數來創建使用傳遞的參數消息作爲

for(var i = 0; i < agrs.length; i++){ 
    reg = new RegExp('\{'+i+'\}', 'gi'); 
    key = key.replace(reg,agrs[i]) 
} 

的問題是,它不能夠採取帕拉姆i創造了reg進出口。

達到此目的的方法是什麼?

+2

@casperOne,什麼是重複?既沒有[這個問題](http://stackoverflow.com/questions/4029109/javascript-regex-how-to-put-a-variable-inside-a-regular-expression)也沒有[這個問題](http:// stackoverflow.com/questions/494035/how-do-you-pass-a-variable-to-a-regular-expression-javascript)與這個問題是一樣的。這個問題很重要,因爲它實際上顯示了將一個字符串變量混合成正則表達式模式,而其他問題的答案僅提供了逃避字符不成問題的示例。 – MandM 2015-12-04 13:08:18

回答

52

您的正則表達式是/{0}/gi,因爲您是通過字符串創建的。這不是一個有效的表達。 你需要逃避{在正則表達式,因爲它在正則表達式語法中的特殊含義,所以它應該是:

new RegExp('\\{'+i+'\\}', 'gi'); 

這是/\\{0\\}/gi。你需要轉義轉義字符串中的\\

+0

像涼風一樣工作。謝謝。 – Nrj 2009-01-28 13:15:50

3

我想你第二個行應該是

reg = new RegExp('\{'+i+'\}', 'gi'); 

,但我不知道如果這是你唯一的問題或沒有。

+0

是的,就是這樣,但它不允許創建一個。說「無效量詞」。 – Nrj 2009-01-28 12:57:09

6

我強烈建議您使用String.replace()的函數形式來解決您的問題,而不是試圖在迭代{0},{1}等的for循環中參數化正則表達式。換句話說,不要尋找「{0}」或「{1}」,只要查找圍繞任意數字的{{[[0-9] +)}'(即{}}並將一個函數傳遞給replace()函數,以基於{}之間的數字智能地替換這些表達式。這使您可以使用RegExp文字,您可以將其寫爲/ {([0-9] +)}/。而不是在字符串轉義字符周圍亂

事情是這樣的:

s='the song says {0} little {1} little {2} little-endians'; 
args=['zero','one','two']; 
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch) 
    {return args[(+firstmatch)]; } 
); 

這將產生

the song says zero little one little two little-endians 

看到這個similar question

編輯:如果你想離開那個比你args列表的長度時,單獨的項目,一定要理智檢查參數號:

s='the song says {0} little {1} little {2} little-endians,\n'+ 
    ' {3} little {4} little {5} little-endians'; 
args=['zero','one','two']; 
new_string = s.replace(/{([0-9]+)}/g, function(wholematch,firstmatch) 
    {var i = +firstmatch; return i < args.length ? args[i] : wholematch;} 
); 

這將產生

the song says zero little one little two little-endians, 
{3} little {4} little {5} little-endians