2012-04-12 11 views
5

Ho un'espressione regolare che controlla se una stringa è un numero. Il separatore delle migliaia di formati è uno spazio bianco, il separatore decimale è un punto. La parte dopo le decimali è facoltativa.Java regex String.matches che funzionano in modo incoerente

Il problema è che ad un certo punto la funzione String.matches() smette di funzionare come previsto. Ciò che ha funzionato prima, non funziona più.

Ad esempio, il codice JUnit:

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

L'ultima riga con "8 734" fallisce. Quando lo sostituisco con "1 000" continua a fallire. Alla fine, lo stesso codice nella stessa esecuzione passa nella quarta riga di asserzioni, ma fallisce nell'ultimo (il nuovo codice viene salvato!). Ma ci sono momenti in cui tutto inizia a funzionare come previsto fino a .. iniziare di nuovo a mancare. Quindi suppongo che sarà difficile riprodurre il mio problema. Forse c'è qualcos'altro che sto facendo male che non ho notato e quindi descritto, ma ho cercato di renderlo il più semplice possibile. Questo mi confonde molto. String.matches() ha una memoria o cosa?

Potrebbe esserci qualcosa di sbagliato nell'espressione regolare? Sto saltando ^$ poiché String.matches funziona comunque su tutta la stringa. Ho provato i pacchetti java.util.regex e jregex, il problema persisteva.

Sto usando JDK 6u31.

Qualsiasi idea apprezzata.

UPD: ok, dopo aver inserito questo Q il codice ha iniziato a funzionare e non ha fallito finora. Forse era qualcosa con me, ma questo mi ha infastidito dalla scorsa settimana e sono stato in grado di replicarlo ancora e ancora. Continuerò con il mio codice e se continuerà a funzionare chiuderò questo problema. Inoltre proverò a determinare che cosa ha causato esattamente il problema. Nel frattempo, se c'è qualcuno che ha riscontrato lo stesso problema, per favore condividi le tue conoscenze. Altrimenti, questo sembra un problema che può essere risolto dalla conoscenza, non dal debug. Per difendermi dalla stupidità posso dire di aver programmato per molti anni e questo è il primo post in assoluto nei forum :). Fino ad ora ero in grado di risolvere i miei problemi con il debugging, la lettura di documenti e la ricerca di forum di altre Q.

+0

Funziona per me in JDK 6u19 –

+0

Puoi pubblicare la classe effettiva chiamando quei test JUnit? –

+4

Sei sicuro di non aver eseguito una vecchia classe compilata? –

risposta

1

OK, finora non ho ancora riscontrato questo problema.

Per gli altri che capita di incontrare questo un giorno, posso solo suggerire di ripulire l'ambiente in cui si sta lavorando. Questo deve fare qualcosa con la JVM corrotta o lo stato di memoria del computer.

Grazie a tutti per il loro contributo.

0

BTW: Provare a utilizzare il modello precompilato Pattern p = Pattern.compile(regEx) e il single matcher per tutte le asserzioni assertTrue(p.matcher("1 000 000").matches()). Il metodo delle corrispondenze di stringa compila il modello regex ogni volta che lo chiami

Problemi correlati