2013-01-18 84 views
1
function listPlayers(subject){ 
    var players=[]; 

    var myregexp = /(\S*)(?:,\s|$)/g; 
    var match = myregexp.exec(subject); 
    while (match != null) { 
     players.push(match[1]); 
     match = myregexp.exec(subject); 
    } 
    return players; 
} 

我想匹配的字符串是這樣�r Henderson�r�f, Pedrin�r�f, �c~�lArthur�r�f, John�r�f爲什麼這個正則表達式導致無限循環?

我期望的輸出是這樣的['Henderson�r�f', 'Pedrin�r�f', '�c~�lArthur�r�f', 'John�r�f']

我不明白的是對正則表達式的哥們似乎一切都OK的數組。 enter image description here

+0

無限循環在哪裏? –

+1

問題是'*'與前瞻一起。最後,表達式匹配時不消耗任何字符(由於'*',它不必因爲「*」而匹配最後一個位置,因爲lookeahead),所以'.exec'被卡住了。 –

+1

@FelixKling:本質上是正確的,但在OP的正則表達式中沒有前瞻。這是執行他的'''錨點,以及JavaScript的零寬度匹配和'exec()'方法的處理。 ([ref](http://blog.stevenlevithan.com/archives/exec-bugs)) –

回答

2

只是爲了興趣,使用零寬度正預測先行斷言也許更簡單的方法:

function listPlayers(subject) { 
    return subject.match(/\S+(?=,\s|$)/g); 
} 
+0

+1。將'\ S *'改爲'\ S +'可以解決當前的問題,但是這種方法正是您想要的:一個包含逗號和空格的所有名字的數組已經被刪除。 –

+0

Thanks everyone爲了指出我的錯誤,我選擇了這個答案,因爲我喜歡這個解決方案,我試圖將這個結果歸檔爲「非捕獲組」,但我不知道'lookahead'本身不會返回'lookahead',這是我想要的。 –

5

嘗試改變正則表達式來:

var myregexp = /(\S+)(?:,\s|$)/g; 

我覺得循環可能是因爲它反覆在最後一個空字符串相匹配。

因爲我不認爲你有興趣獲得零長度的名字,所以這可能是一個更好的正則表達式。

相關問題