2009-03-03 43 views
8

我寫了一個Javascript RegExp測試來檢測日期字符串格式,我錯誤地添加了一個冗餘的「g」標誌,並發現了一些有趣的東西。Javascript有趣的測試RegExp

var s = "2009/03/10"; 
var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g; 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 

我得到了一個'真',後面跟着'假',然後是'真',然後是'假'。如果我使用循環來執行它,我發現了一些更有趣的東西,我在IE和Safari中獲得了四個「真實」,在FF和Chrome中獲得了true,false,true和false。

for (var i=0; i<4; i++) 
{ 
    var s = "2009/03/10"; 
    var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g; 
    alert(regex.test(s)); 
} 

是否有人有想法來解釋爲什麼JavaScript的正則表達式的行爲就像是什麼原因瀏覽器返回不同的結果? (與變量聲明和生命範圍有關?)

回答

19

當您在JS RegExp上使用全局標誌時,「test」和「exec」方法每次在第一次匹配時暫停,但保留一個指向它們停止在串。該指針可以在lastIndex屬性上檢查。當您再次撥打「測試」或「執行」時,它會開始搜索從lastIndex開始的比賽。

因此,當您在與整個字符串匹配的字符串上測試RegExp時,會將lastIndex設置爲字符串的結尾。下一次測試時,從字符串末尾開始,返回false,並將lastIndex設置回零。

MDC具有此行爲的decent explanation

+0

非常感謝,在MDC的交代很清楚。 – Darkthread 2009-03-03 03:08:06

0

爲了避免這種奇怪的行爲,請不要使用全局(g)標誌。

此代碼應輸出: '真', '真', '真', '真'

var s = "2009/03/10"; 
var regex=/^\d{4}[/]\d{2}[/]\d{2}$/i; 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 
alert(regex.test(s)); 

全局(克)平設置屬性RegExp.lastIndex。所以每個測試()都會從最後一個停止的地方開始。

欲瞭解更多信息請參見文檔中關於RegExp.lastIndex