2012-02-14 15 views
5

Düzenleme kuralımı javascript'te test ederken sürekli olarak garip bir sonuç elde ediyorum. http://jsfiddle.net/s5fYf/15/Javascript Regex .test() 'i geçmeli, ancak başarısız görünüyor - neden?

Bu Oluşturduğum bir web projesinden alınır:

İşte benim keman var. Doğrulama işlevlerimin içine, her kuralı değere göre doğrulayan bir doğrulama nesnesini geçiriyorum. Biri yanlışsa, döngüyü durdurmalı ve bir iletiyi ve başarısız kuraldan cssClass'ı alan bir döndürme nesnesini döndürmelidir.

Sorun, normal ifadenin imkansız olması durumunda bile doğrulama yönteminin yanlış döndüğü görülüyor! Yani bir şey anahtarını kaçırmış gibi hissediyorum. Hata ayıklama çıktısından çıktı ifadesini döndürdüğünüzü görebiliyorsunuz, ancak kodda test edildiğinde açıkçası başarısız oluyor. Bu, projemde gördüğüm şeyle aynıdır, burada hata ayıklama çıktısını çıkarırsam geri dönüş değeri temel olarak doğru ile yanlış arasında geçiş yapar.

Temel olarak /regex/.test(value) işlevi, tutarlı olan ama beklediğim gibi değil, doğru ve yanlış arasında salınım yapıyor gibi görünüyor ... Bu yüzden, bu tuhaf davranışa neden olan sorudur !?

Düzenli ifademi çözümün dışında test ettim ve görebildiğim kadarıyla çalışıyor.

GÜNCELLEME: benim regex gelen 'g' veya global bayrağını belirtilmemesi

bu sorunu çözdü.

Why RegExp with global flag in Javascript give wrong results?

cevap

19

O javascript düzenli ifadeler test yöntemi sonucunu döndürür gerçeğine aşağı kaynar:

tam küresel bayrağının açıklama ve tuzaklar için aşağıdaki cevabını ve daha sonra bu bağlantıya bakın ve maçtan sonra bir işaretçiyi hareket ettirir.

Böylece ilk çağrı doğru olarak döner, ardından ikincisi false değerini döndürür. http://jsfiddle.net/B9aVA/

var regex = /^.+$/g 
var input = "Hello"; 
console.log(regex.test(input)); 
console.log(regex.test(input)); 

testini iki kez çağırır

true 
false 

Yani kodu yazar: Bu örneği edin

Benim önerim kez test arayıp bir değişkene sonucu saklamaktır
case "regex": 
    $(".debug-info").append('<span>Result: ' + validation[i].rule.test(value) + '</span><br />'); 
    if (!validation[i].rule.test(value)) 
      returnValue.isValid = false; 
    break; 

, ve bunun yerine

case "regex": 
    var result = validation[i].rule.test(value); 
    $(".debug-info").append('<span>Result: ' + result + '</span><br />'); 
    if (!result) 
      returnValue.isValid = false; 
    break; 

Hikayenin ahlakı: Yöntemler yan etkilere sahip olabilir, bu onları özelliklerden ayıran şeydir.

+0

Güncel bilgiler: http://jsfiddle.net/Ym2hW/2/ Artık test() ve dönüş değeri arasında tutarlılık elde ediyorum. Fakat eğer bulanıklığı birden çok kez tetiklerseniz, aynı salınımları elde edersiniz. – Jon

+1

Tamam, konu küresel bayrakla ilgili, benim güncellememi yukarıda gör. – Jon

+0

Teşekkür ederiz! Global bayrağı 'g' global ifademi kullandığımda depolanan 'test()' sonucu sorunu giderildi. Küresel bayrak ile ek regex'in yaklaşık% 20'si.test() çağrıları geçerli olduklarında başarısız oldu. –