2009-03-03 18 views
8

Tarih dizesi formatını tespit etmek için bir Javascript RegExp testi yazdım, yanlışlıkla "g" bayrağı ekledim ve ilginç bir şey buldum. Javascript'in ilginç testi 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)); 

aldığım bir 'gerçek' bir 'false' izledi, sonra başka 'gerçek', daha sonra başka bir 'yanlış'.

Bunu yürütmek için bir döngü kullanırsam, daha ilginç bir şey buldum, IE ve Safari'de dört "doğru" aldım ve FF, Chrome'da doğru, yanlış, doğru, yanlış.

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)); 
} 

herkes JavaScript regex böyle davranır ve hangi neden tarayıcılar farklı sonuçlar döndürür niçin fikri vardır mu? (değişken bildirim ve yaşam kapsamıyla ilgili?)

cevap

19

JS RegExp'de bir global bayrak kullandığınızda, "test" ve "exec" yöntemleri her biri ilk karşılaşmada durur, ancak aramayı durdurdukları yere bir işaretçi tutar. dize. Bu işaretçi lastIndex özelliğinde denetlenebilir. Tekrar "test" veya "exec" dediğinizde, lastIndex'dan başlayan bir eşleşme aramaya başlar.

Yani, bir dizgiyi tüm dizeyle eşleşen bir dizide test ettiğinizde, lastIndex dizenin sonuna ayarlanır. Bir dahaki sefere, sınamanın sonunda başlar, false döndürür ve lastIndex sıfır olarak döndürür.

MDC, bu davranışa sahip bir decent explanation sahiptir.

+0

Çok teşekkürler, bkz MDC en explaination çok açıktır. – Darkthread

+0

+1 yardım için teşekkürler, her testten önce reg.lastIndex = 0 ayarı problemimi çözdü. – bendewey

+0

Bu, örneğin bir döngü içinde sorunlara neden oluyorsa, her bir testten önce lastIndex = 0 ayarlayacağınız görülüyor. – k0nG

0

Bu garip davranışı önlemek için genel (g) bayrağını kullanmayın.

Bu kod çıktılayacaktır: 'doğru 'doğru', 'doğru', 'gerçek'

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)); 

genel (g), düz özelliği RegExp.lastIndex ayarlayın. Böylece her bir test() sonuncunun durduğu yerden başlayacaktır. Daha fazla bilgi için

dokümantasyon yaklaşık RegExp.lastIndex