2016-02-27 75 views
2

大家都告訴我,如果我有一個像/blah/g這樣的正則表達式,我反覆exec它在一個字符串上,我會經歷所有的比賽,直到我結束。查找所有的正則表達式匹配

但是如果我正則表達式是/^$/g和我的字符串是""?那什麼?

這工作得很好:

var re = /bar/g, 
    str = "foobarfoobar"; 
while ((match = re.exec(str)) != null) { 
    alert("match found at " + match.index); 
} 

這進入一個無限循環!

var re = /^$/g, 
    str = ""; 
while ((match = re.exec(str)) != null) { 
    alert("match found at " + match.index); 
} 

爲什麼,Javascript?爲什麼?

(更重要的是,如何在地球上我應該通過一個正則表達式匹配的迭代,如果我正則表達式中包含^$和我的字符串也可能會被空字符串???)

+1

不用其他的'/ M'改性劑,在'/^$/G 'regex沒有多大意義,因爲'/ g'搜索多個匹配,但只能有一個匹配。 –

+0

你需要支持任何用戶生成的正則表達式或'^ $'爲它沒有任何意義遍歷任何東西只是一個特例? – Aprillion

+0

由於您沒有捕獲組,所以''exec'不需要'while'。你可以用'match' – Oriol

回答

3

這裏的問題是造成當正則表達式匹配空字符串時,JS正則表達式引擎不會提高其索引。您可以將它 「手動」 一些額外的代碼(取自regex101.com示例代碼生成頁面):

var re = /^$/g; 
 
var str = ''; 
 
if ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { // Here you manually advance 
 
     re.lastIndex++;    // the index 
 
    } 
 
    alert(m[0]); 
 
}

+1

嗯,還好。呃,我仍然覺得我所看到的所有代碼都已經破壞了。當定時器啓動時我會接受。 – thedayturns