Dos referencias imprescindibles

1:
external image Kb0OG6s.png
https://xkcd.com/208/

2: ...Si te enfrentas a un problema y piensas "Ya sé, ¡usaré expresiones regulares!" - entonces tienes DOS problemas.



Enlaces para aprender regexp


http://mejorenjava.wordpress.com/category/expresiones-regulares/ - Los dos posts más antiguos (abajo) tienen una referencia con ejemplos útiles.
http://www.emezeta.com/articulos/introduccion-a-las-expresiones-regulares
http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/
http://tutorials.jenkov.com/java-regex/matcher.html
Ejemplos fáciles de visualizar: http://tech.pro/tutorial/1214/javascript-regular-expression-enlightenment#meta__shorthand_characters

Referencia


Java: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions



Ejemplos de uso

Comprobar un texto entero

Caso de uso más sencillo: comprobar que un texto entero se ajusta a una expresión. Por ejemplo, un DNI:
import java.util.regex.Pattern;
// ...
// Ejemplo para comprobar un DNI (8 dígitos y una letra en minúscula o mayúscula)
Pattern p = Pattern.compile("[0-9]{8}[a-zA-Z]"); // patrón (qué queremos comprobar).
Matcher m = p.matcher("12345678Z"); // objeto con el texto a comprobar
boolean b = m.matches(); // resultado de la comprobación
Para una comprobación tan sencilla, podemos utilizar un método más breve:
boolean b = Pattern.matches("[0-9]{8}[a-zA-Z]", "12345678A");
Todavía más sencillo: el método matches de la string.
boolean b = micadena.matches("\\d{8}\\D"); // \d = dígito numérico y \D = letra May. o min.

Ejercicio clase 6 febrero

Comprobar que el código de un departamento está compuesto por
  • 3 letras en minúscula.

    • Un caracter que esté comprendido entre a y z (minúsculas)[a-z] que aparece exactamente tres veces {3}

  • Puede haber o no un separador que ha de ser " " o "-".
    • Un caracter " " o "-"[ -]; Con "\s" indicamos que es cualquier tipo de espacio en blanco (también tabulador... ), pero OJO: hay que escaparlo con una segunda barra: [\\s-]


    • Tiene que aparecer un número de veces comprendido entre 0 y 1 :{0,1} o bien ?

  • 3 dígitos.
    • Igual que antes: [0-9]{3} o también podemos usar el selector \d (dígito) escapado: [\\d]{3} .

boolean b = Pattern.matches("[a-z]{3}[ -]{0,1}[0-9]{3}, "abc 123");
Podemos comprobar visualmente qué hace la expresión con regexper o debuggex
external image dk9ONFitJ_rkHKsb.png

Añadido clase 6 febrero

Cuando tengan separador, convertir los códigos a otros sin separador; de paso practicar agrupamiento en las expresiones regulares.
Usaremos la clase Matcher y el agrupamiento
  1. Agrupamos los fragmentos que buscamos dentro de la expresión regular entre paréntesis:
    las tres cifras ([a-z]{3}) y los tres números ([\\d]{3}) .
  2. Usando un Matcher.group, devuelve texto original (elemento 0 ) y cada uno de los grupos. Explicado en stackoverflow.
Pattern p = Pattern.compile("([a-z]{3})[-\\s]([\\d]{3})");
Matcher m = p.matcher(codigo);
if (m.matches()){
    return m.group(1) + m.group(2); // 0 es el texto original, 1 el primer grupo ...
} else {
    throw new CodigoInvalidoException();
}

Usando validadores hibernate

Revisar los ficheros de solución del paquete jsr303:


Falta explicarlo.


Herramientas web para comprobar regexp

http://regex.larsolavtorvik.com/ - sencillo pero muy útil, contiene una referencia de expresiones en el lateral derecho y permite probar textos, matches y expresiones.
Comprobadores visuales:
http://www.regexper.com/ y https://www.debuggex.com/ - introduces una expresión regular y la descompone en bloques con dibujitos para explicarlas.

Cheatsheets

http://www.addedbytes.com/download/regular-expressions-cheat-sheet-v2/png

Detalles

Lazy y greedy: http://stackoverflow.com/questions/2301285/what-do-lazy-and-greedy-mean-in-the-context-of-regular-expressions