2012-04-12 20 views
5

Dizenin bir sayı olup olmadığını kontrol eden bir düzenli ifadem var. Biçimin bin ayırıcısı beyaz boşluktur, ondalık ayırıcı noktadır. Ondalık kısım isteğe bağlıdır.Java regex String.matches tutarsız çalışıyor

Sorun, bir noktada String.matches() işlevinin beklendiği gibi çalışmayı durdurmasıdır. Daha önce ne çalıştı, artık çalışmıyor. Örneğin

JUnit kodu:

import junit.framework.Assert; 
import org.junit.Test; 

public class RegExTest { 

    @Test 
    public void testThousandSeperatorRegex() 
    { 
     String regEx = "([0-9]{1,3}([0-9]{3})*(\\.[0-9]+)?|\\.[0-9]+)"; 
     Assert.assertEquals(true, "1".matches(regEx)); 
     Assert.assertEquals(true, "10".matches(regEx)); 
     Assert.assertEquals(true, "100".matches(regEx)); 
     Assert.assertEquals(true, "1 000".matches(regEx)); 
     Assert.assertEquals(true, "10 000".matches(regEx)); 
     Assert.assertEquals(true, "100 000".matches(regEx)); 
     Assert.assertEquals(true, "1 000 000".matches(regEx)); 
     Assert.assertEquals(true, "10 000 000".matches(regEx)); 
     Assert.assertEquals(false, "10000.56".matches(regEx)); 
     Assert.assertEquals(true, "8 734".matches(regEx)); 
    } 
} 

son satır "8 734" başarısız olur. "1 000" ile değiştirdiğimde başarısız olmaya devam ediyor. Sonunda aynı koddaki aynı kod, 4. iddialar satırında geçer, ancak en sonunda başarısız olur (yeni kod kaydedilir!). Ama her şeyin çalıştığı gibi çalışmaya başladığı zamanlar vardır. Bu yüzden sorunumu yeniden üretmenin zor olacağını düşünüyorum. Belki de yanlış yaptığım ve fark etmediğim ve tanımladığım başka bir şey var, ama mümkün olduğunca basit yapmaya çalıştım. Bu beni çok karıştırıyor. String.matches() bir belleğe sahip mi, ne var?

Düzenli ifadede bir sorun olabilir mi? String.matches zaten tüm dizede çalıştığı için ^$'u atladım. Java.util.regex ve jregex paketlerini denedim, sorun devam ediyordu.

JDK 6u31 kullanıyorum.

Herhangi bir fikir takdir edildi.

UPD: tamam, bu Q gönderildikten sonra kod çalışmaya başladı ve bugüne kadar başarısız olmadı. Belki de benimle bir şeydi, ama bu geçen haftadan beri beni rahatsız etti ve tekrar tekrar çoğaltabildim. Kod parçamla devam edeceğim ve çalışmaya devam edersem bu sorunu kapatacağım. Ayrıca sorunun tam olarak nedenini belirlemeye çalışacağım. Bu arada, aynı sorunu yaşayan birileri varsa, lütfen bilgilerinizi paylaşın. Aksi takdirde, bu hata ayıklama ile değil, bilgi ile çözülebilecek bir soruna benziyor. Kendimi aptallığından korumak için uzun yıllardır program yapıyorum diyebilirim ve bu forumlarda ilk kez gönderilen yazıdır :). Şimdiye kadar, hata ayıklama, doküman okuma ve diğer Q'ların forumlarını aramayla sorunlarımı çözebildim.

+0

JDK 6u19'da işler Benim için –

+0

Bu JUnit testlerini çağıran asıl sınıfı yayınlayabilir misiniz? –

+4

Eski bir derlenmiş ders çalıştırmıyor musunuz? –

cevap

1

Tamam, şimdiye kadar bu sorunu daha önce görmedim.

Bir gün bununla karşılaşan diğer kişiler için, yalnızca çalıştığınız ortamı temizlemeyi önerebilirim. Bu, bozuk JVM veya bilgisayarın bellek durumuyla ilgili bir şey yapmalıdır.

Katkıları için herkese teşekkürler.

0

BTW: bütün iddiaların assertTrue(p.matcher("1 000 000").matches()) için önceden derlenmiş desen Pattern p = Pattern.compile(regEx) ve tek eşleyici kullanmayı deneyin. String'in eşleşmesi yöntemi, her çağrışınızda regex desenini derler