2011-08-24 73 views
2

我一直在調試這一個應用程序一段時間,它引導我到這個測試用例。當我在firefox 3.6.x中運行它時,它只能運行50%的時間。firefox 3.6.20正則表達式給出不一致的結果

var success = 0; 

var pat = /(\d{2})\/(\d{2})\/(\d{4})\s(\d{2}):(\d{2})\s(am|pm)/g; 
var date = "08/01/2011 12:00 am"; 

for(var i=0;i<100;i++) if(pat.exec(date)) success++; 
alert("success: " + success + " failed: " + (100 - success)); 

它提醒success: 50 failed: 50

這是怎麼回事呢?

回答

4

g標誌意味着在第一次匹配後,第二次搜索從匹配子串的末尾(即在字符串末尾)開始,並失敗,將開始位置重置爲字符串開頭。

如果你的正則表達式使用「g」標誌,就可以使用exec方法多次找到相同的字符串匹配連續。當您這樣做時,搜索開始於由正則表達式的lastIndex屬性指定的子字符串strtest也將提前lastIndex屬性)。

from MDC docs for RexExp.exec()。 (另請參閱RegExp.lastIndex

2

您正在使用全局標誌。因此,正則表達式僅與特定索引匹配。

var r = /\d/g; 
r.exec("123"); // 1 - lastIndex == 0, so matching from index 0 and on 
r.exec("123"); // 2 - lastIndex == 1, ditto with 1 
r.exec("123"); // 3 - lastIndex == 2, ditto with 2 
r.exec("123"); // null - lastIndex == 3, no matches, lastIndex is getting reset 
r.exec("123"); // 1 - start all over again 
:每個匹配, pat.lastIndex == 19,然後 pat.lastIndex == 0

一個更簡單的例子後

相關問題