2012-04-12 15 views
5

Tengo una expresión regular que comprueba si una cadena es un número. El separador de mil del formato es un espacio en blanco, el separador decimal es un punto. La parte posterior a decimal es opcional.Java regex String.matches que funciona de forma incoherente

El problema es que en algún momento la función String.matches() deja de funcionar como se esperaba. Lo que funcionó antes, ya no funciona.

Por ejemplo, el código 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)); 
    } 
} 

La última línea con "8 734" falla. Cuando lo reemplazo con "1 000", continúa fallando. Eventualmente, el mismo código en la misma ejecución pasa en la 4ª línea de aserciones, pero falla en el último (¡el nuevo código se guarda!). Pero hay momentos en que todo comienza a funcionar como se esperaba hasta que ... comience a fallar nuevamente. Entonces, supongo que será difícil reproducir mi problema. Tal vez hay algo más que estoy haciendo mal que no he notado y descrito así, pero traté de hacerlo lo más claro posible. Esto me confunde mucho. ¿String.matches() tiene una memoria o qué?

¿Podría haber algún problema con la expresión regular? Me estoy saltando ^$ ya que String.matches funciona en cadena entera de todos modos. He probado los paquetes java.util.regex y jregex, el problema persistió.

Estoy usando JDK 6u31.

Cualquier idea apreciada.

UPD: bien, después de publicar esto Q el código comenzó a funcionar y no ha fallado hasta el momento. Tal vez fue algo conmigo, pero esto me ha molestado desde la semana pasada y he podido replicarlo una y otra vez. Continuaré con mi fragmento de código y, si continúa funcionando, cerraré este problema. También intentaré determinar qué causó exactamente el problema. Mientras tanto, si hay alguien por ahí que ha tenido el mismo problema, por favor comparta sus conocimientos. De lo contrario, esto parece un problema que se puede resolver por conocimiento, no por depuración. Para defenderme de la estupidez puedo decir que he estado programando durante muchos años y esta es la primera publicación en foros :). Hasta ahora pude resolver mis problemas con la depuración, la lectura de documentos y la búsqueda en foros de otras Q.

+0

Trabaja para mí en JDK 6u19 –

+0

¿Puedes publicar la clase real llamando a esas pruebas JUnit? –

+4

¿Estás seguro de que no estás ejecutando una clase antigua compilada? –

Respuesta

1

OK, hasta ahora no he encontrado este problema.

Para otros que coincidan con este algún día, solo puedo sugerir que limpien el entorno en el que están trabajando. Esto tiene que hacer algo con JVM dañado o el estado de la memoria de la computadora.

Gracias a todos por su contribución.

0

BTW: Intente utilizar el patrón precompilado Pattern p = Pattern.compile(regEx) y el emparejador único para todas las aserciones assertTrue(p.matcher("1 000 000").matches()). El método de coincidencias de cadena compila el patrón de expresiones regulares cada vez que lo llame