2013-02-23 57 views
0

我具有正則表達式的陣列,此刻在長度只是一個元件,並且我要搜索/由通過陣列循環替換字符串使用匿名功能:在與string.replace()方法

var str = "i am*happy all the*time", 
    rex = [ 
     /(\S)\s*\*\s*(\S)/g 
     ], 
    i = 0, 
    r = rex.length; 

這是我試着在瞬間進行實現這一點:

for (i; i < r; i += 1) { 
    str.replace(rex[i], function(star, p1, p2) { 
     console.log(i, star, p1, p2); 
     return p1 + '\\s*(.*)\\s*' + p2; 
    }); 
} 

結果應該是i am*\\s*(.*)\\s*happy all the\\s*(.*)\\s*time。但目前,str似乎不受影響,即使我檢查控制檯時正在進行相關的匹配。你可以自己看到這個here

所以我錯過了一些簡單的東西,我誤解了有關在String.replace()中使用lambda表達式的問題,還是在這裏存在更根本性錯誤?

...

額外的信息: 我使用Chrome 24,現在,如果這是利益;我前一段時間讀過String.replace()中的匿名函數不適用於所有瀏覽器,儘管我認爲現在可以解決這個問題(該選項是在ECMAScript v3中引入的)。

+2

JS字符串是不可變的,函數*返回一個新的字符串。 – Bergi 2013-02-23 12:19:12

+1

順便說一句,而不是該功能,你可以使用'「$ 1 \\ s *(。*)\\ s * $ 2」' – Bergi 2013-02-23 12:20:13

+0

@Bergi謝謝。意識到了字符串的替代方法,但是正在用更復雜的函數來玩轉。只是想先弄清楚基礎知識。 – guypursey 2013-02-23 20:38:55

回答

1

String.replace()不會更改原始字符串,但會返回新字符串。你應該分配結果

for (i; i < r; i += 1) { 
    str = str.replace(rex[i], function(star, p1, p2) {...}) 
} 
+0

太簡單了。我認爲這本參考書是我拋棄的,因爲沒有一個例子是分配給變量的結果。謝謝。 – guypursey 2013-02-23 20:39:48