2011-10-25 37 views
2

閱讀this postthis doc後,我試着編寫一個函數,它將返回字符串中每個正則表達式出現的索引(在這種情況下,每次出現的數)。我這把上面鏈接的文檔中的代碼:在字符串中查找每個出現的正則表達式

var myRe = /ab*/g; 
var str = "abbcdefabh"; 
var myArray; 
while ((myArray = myRe.exec(str)) != null) 
{ 
    var msg = "Found " + myArray[0] + ". "; 
    msg += "Next match starts at " + myRe.lastIndex; 
    print(msg); 
} 

而且把它變成這樣:

var myRe = /([0-9]*)/g; 
var str = "gfarg h43kjh arjh 343"; 
var myArray; 

while ((myArray = myRe.exec(str)) != null) 
{ 
    var msg = "Found " + myArray[0] + ". "; 
    msg += "Next match starts at " + myRe.lastIndex; 
    alert(msg); 
} 

這將無限循環顯示同樣的結果。我其實有兩個問題。我如何顯示每個整個號碼的索引(在我的樣本字符串"gfarg h43kjh arjh 343"中是7和18)。而且,爲什麼我當前的代碼無限循環?

回答

2

您的代碼循環無限,因爲您的正則表達式匹配空字符串。不要那樣做:)。嘗試:

var myRe = /([0-9]+)/g; 

這將已經找到整數。有關工作示例,請參閱http://jsfiddle.net/nrabinowitz/3aHxS/1/

+0

確定只是一個快速的,如果正則表達式('myRe'上面)是我的函數將接收的參數。我應該如何預測它會永遠循環,比如拋出異常?是否通過檢查'index'屬性是兩次(我假設手段沒有移動)還是有更簡單的方法? – Juan

+0

那麼,作爲一項安全措施,您可以設置一個計數器並檢查while((myArray = myRe.exec(str))!= null && myCounter nrabinowitz

+0

...雖然如果你只是想避免這個特殊問題,我想你可以用'if(myRe.test(''))'來測試,它會捕獲一個匹配空字符串的正則表達式。 – nrabinowitz

相關問題