Expresiones regulares
Las expresiones regulares (o regex) son series de caracteres que se usan para hacer búsquedas o sustituciones en textos.
En Java podemos acceder a estas funcionalidad a través de las clases del paquete java.util.regex, y de manera limitada a través de la clase String.
Reglas básicas
Las expresiones regulares se componen siguiendo unas reglas especificas que pueden combinarse libremente_
"hola": una serie de caracteres implica una búsqueda literal; sólo “hola” encajaría aquí."[0-9abcdef]": una serie de caracteres (o un rango válido con guión) implica que aceptamos cualquier carácter de estos; un carácter hexadecimal cualquiera encaja aquí."[^0-9]": lo anterior con un^antes indica que podemos usar cualquier carácter menos los del rango; en este caso significa que aceptamos cualquier carácter que no sea un número.".ola": el punto es el comodín, indicando que cualquier carácter vale; tanto “bola” como “cola”, como “Hola” encajan; en Java no."[a-z]{1, 10}": los números entre corchetes indican el número admitido de repeticiones; este regex requiere una palabra en minúsuculas de 1 a 10 caracteres.{9}se puede usar para indicar un número exacto de repeticiones.{4,}indica un número mínimo de repeticiones.- Se pueden usar los siguientes atajos:
?para{0, 1},+para{1,}y*para{0,}.
- También hay atajos disponibles para conjuntos de caracteres comunes, como
\spara espacios,\dpara cifras o\wpara letras, números y barra baja. [\w]+.([A-z]+): las partes de la expresión entre paréntesis representan grupos de captura, partes del String que nos interesa procesar; en este ejemplo, nuestro grupo de captura intenta representar la extensión de un nombre de fichero.
Métodos de regex en la clase String
Cuándo no usar estos métodos
Los métodos de expresiones regulares disponibles en la clase String compilan la expresión en un nuevo Pattern cada vez que se llaman. Esto significa que si hacemos operaciones con la misma expresión regular continuamente (por ejemplo, comprobar que un parámetro String email es una dirección válida) es recomendable usar directamente las clases java.util.regex.
Métodos disponibles
matches: comprueba si el String al completo encaja en la expresión.split: da un array de Strings resultado de partirse usando la expresión regular; por ejemplo,"a,b,c".split(",")dará como resultado el array{ "a", "b", "c" }.- El argumento opcional
limitindica el máximo de partes, pudiendo ser un número negativo para que no haya límite, o 0 para el mismo comportamiento, pero descartando los Strings vacíos al final; por ejemplo,"odoo".split("o", -1)nos dará{ "", "d", "", "" }, pero"odoo".split("o", 0)nos dará{ "", "d" }.
- El argumento opcional
replaceFirst: sustituye el primer substring que encaje por el reemplazo propuesto; por ejemplo,"abacos".replaceFirst("ab", "ai")dará como resultado"aiacos".replaceAll: sustituye todos los substring que encajen por el reemplazo propuesto; por ejemplo,"abacos".replaceFirst("a", "i")dará como resultado"ibicos".
TO DO
Clase Pattern y derivados
Para usar la librería de regex, lo primero es llamar a Pattern.compile(regex), que compila la expresión regular para que sea usable por nuestro código. A partir de aquí, podemos acceder al método split en el que se basa el método de la clase String.
Cuando queramos operar con un String usando dicha expresión, llamaremos a pattern.matcher(string), que nos retornará un Matcher con la información del cotejado. A través de él podremos llamar a varios métodos, siendo los más habituales matches, replaceFirst y replaceAll, que son los usados por los métodos con el mismo nombre en la clase String, pero con el beneficio de poder reutilizar el Pattern para ahorrar recursos, y el método group para sacar los distintos grupos de captura.
Ejercicios
Validador de DNI
Desarrolla una aplicación a la que se le suministre el DNI y:
- Compruebe que tiene un formato válido.
- A través de grupos de captura, extraiga el número y la letra para comprobar que la letra de control es la correcta de acuerdo a su fórmula de cálculo.
camelCase a texto
Desarrolla una aplicación que:
- Reciba un texto y lo valide como camel case (sólo letras).
- Añada espacios antes de cada letra mayúscula y pase todo el texto a minúsculas.
Simplificador de números
Desarrolla una aplicación que:
- Admita un número y compruebe su validez como expresión regular, admitiendo también comas, puntos o espacios
- Elimine los ceros a la izquierda usando grupos de captura.
- Elimine todas las comas, puntos o espacios menos el último, convirtiendo este a un punto.
Procesador de regex
Desarrolla una aplicación que:
- Admita un String como expresión regular y un String para contrastar.
- Muestre si el String propuesto encaja en la expresión regular.
- Muestre los grupos de captura.
Enlaces de interés
- Expresiones regulares (Baeldung)
- Regex101 (campo de pruebas para expresiones regulares)
- iHateRegex (buscador de expresiones regulares de uso común)