Empece este blog para guardar los descubrimientos en programacion que hago cuando tengo un error y por mas que busco en san Google, no encuentro nada hasta despues de horas de andar buscando y horas de prueba y error. Si a alguien algun dia le sirve, que bueno. En general es para mi porque se me olvidan muchos de estos descubrimientos.

Wednesday, October 5, 2011

Java Regular Expression

Regular expressions, o comunmente conocidas como Regex siempre me han dado dolor de cabeza. No, este no es un tutorial de regex pq honestamente aun no las comprendo a plenitud.

Mi primer encuentro con los regex fue cuando se me solicito que en el ingreso de la direccion de una pagina web no se permitiera que el usuario ingresara aaaaaabbbbbbccccccc o 1111143333344444, entienden la idea.

Pues esto se puede hacer con iteradores sobre el string, pero se ve feo, poco creativo y enogorroso. En su lugar, le di un vistazo a las regex. Excelente. Las regex me permitian buscar patrones y de encontrarlo, saber que hacer con ellos. Hasta hay testers de regex online que te permiten revisar tu regex y compararlo con strings para ver si encuentras un patron.

Mi tester online favorito es  http://www.regular-expressions.info/javascriptexample.html

Ingenua y nueva en los regex, no sabia que habia distincion cuando lo utilizas en Java y en JavaScript. Busca testers para Java; si lo encuentras, pasalo que por mas google que hago, nada. Como era una pagina web, use javascript y no se dijo mas. Para Java la cosa cambia mucho y son pocos los sitios web que te ayudan a diferenciarlo.

Entonces, algunos de mis hallazgos.
En Java, los regex llevan por default el * y el $ en el string a comparar, lo cual busca tu patron en todo el string, en lugar en cualquier porcion del string que se encuentre tu patron.

Solucion:
agrega .* REGEX .* en tu expresion y voila! Esto permitira que tome el matches() si encontro patron en cualquier porcion del string.

Ejemplo:
    Pattern p = Pattern.compile(".*(\\w)\\1{3}.*") ;
    matcher m = p.matecher(String);
        if (m.matches()){
             aqui va tu codigo;
       }

NOTA: recuerda que la \\ es una \ de escape.

Eso fue un poco de dolor de cabeza.
Leyendo mas para ver si por fin entendia las regex (nope, aun no), encontre que los regex que pruebes en tu online tester para javascript funcionaran a la perfeccion en tu java class si utilizas el metodo find() en lugar de matches()

Ejemplo:

Pattern p2 = Pattern.compile("(\\w)\\1{2}");
Matcher m2 = p2.matcher(text);
if (m2.find()) {
tu codigo aqui;
}


Bueno, a mi me ayudo bastante! :)

NOTA: la primera solucion se mostro mas efectiva que el find(). Para su consideracion :P

2 comments:

  1. El regex es el mismo tanto para javascript como para java, ahora como lo utilices eso ya es otra cosa porque las implementaciones en java y javascript son distintas, recuerda que el javascript es del lado cliente y el java es el servidor, pero si tu pruebas el regex y el tester te dice que esta bien debe funcionarte para ambos casos. Intenta buscar un plugin en Eclipse para probar regex, debe haber uno.

    ReplyDelete
  2. :O.. excelente george! gracias por el input. Ves, esto funciona mejor que google! :)

    ReplyDelete