2013-03-25 49 views
1

我想在這兩個FF和Chrome的JavaScript正則表達式查找/替換被跳過匹配

' 1 2 3 4 5 6 '.replace(/([\s()])(\d+)([\s()])/g, '$1[num $2]$3'); 

結果我期待下面:

" [num 1] [num 2] [num 3] [num 4] [num 5] [num 6] " 

我得到的結果(兩個瀏覽器):

" [num 1] 2 [num 3] 4 [num 5] 6 " 

即使簡化給出相同的結果:

' 1 2 3 4 5 6 '.replace(/\s(\d+)\s/g, ' [num $1] '); 

任何想法發生了什麼?

回答

1

是的,你的\s正在消耗字符。正則表達式多個匹配向前運行以防止無限循環。所以在第一場比賽之後,你已經在第二場比賽之前了,但是沒有空間匹配,所以它忽略了它。

你要做的是要麼使用lookaheads使你的匹配不消耗,要麼使用\b這是一個零寬度匹配詞邊界。

' 1 2 3 4 5 6 '.replace(/([\s()])(\d+)(?=[\s()])/g, '$1[num $2]') 

這應該適合你。

+0

你的解釋是偉大的,我現在明白了。問題是JS不支持零寬度lookbehind斷言,'\ b'太寬泛,我真的需要空格或parens來匹配數字之前/之後。 – andrew 2013-03-25 22:26:17

+0

是的,我更新了答案。 – OmnipotentEntity 2013-03-25 22:38:27

0

嘗試這個辦法:從評論

' 1 2 3 4 5 6 '.replace(/(\d+)/g, '[num $1]'); 
1

感動答案+加積極前瞻:

' 1 2 3 4 5 6 '.replace(/(\s)(\d+)(?=\s)/g, '$1[num $2]');