Expresiones Regulares¶
Una expresión regular (regex) define un patrón de búsqueda para cadenas. El patrón de búsqueda puede ser cualquier cosa, desde un carácter simple, una cadena fija o una expresión compleja que contenga caracteres especiales que describan el patrón.
Se puede usar una expresión regular para buscar, editar y manipular texto. La expresión regular se aplica en el texto de izquierda a derecha. Se usa ampliamente para definir la restricción en cadenas como contraseña y validación de correo electrónico.
Java Regex API proporciona 1 interfaz y 3 clases en el paquete java.util.regex
:
- MatchResult interface
- Matcher class
- Pattern class
- PatternSyntaxException class
Clases de caracteres y límites de coincidencia¶
La forma más simple de una expresión regular (regex) es una cadena, un literal, un String. Por ejemplo, "Hola" es una regex que coincide (matches) con la palabra "Hola". Si solo usáramos literales como patrón para buscar en un String, las regex no serían muy interesantes. Por eso, se crearon las Character classes
y boundary matches
.
Los boundary matches
o límites de coincidencia son: ^
(al principio del String), $
(final del String), \b
(principio y final palabra). Una clase carácter es como un comodín y representa un conjunto o clase de caracteres.
Regex | Descripción |
---|---|
. | Coincide con cualquier carácter. |
^pattern | El símbolo ^ indica al inicio del String. Encuentra la regex que coincide con el patrón dado al comienzo del String. |
pattern$ | El símbolo $ indica el final del String. Encuentra la regex que coincide con el patrón dado al final del String. |
[abc] | Los corchetes representan un conjunto. El String debe coincidir con la/s letra/s dentro del corchete. |
[abc][12] | El String debe coincidir con las letras a, b ó c, seguidas de 1 ó 2. |
[^abc] | El símbolo ^ dentro de los corchetes indica negación. El String debe coincidir con cualquier carácter excepto a ó b ó c. |
[a-z1-9] | Rango. Busca coincidir las letras minúsculas de la a a la z (ambas incluidas) y los dígitos del 1 al 9 (ambos incluidos). |
a|b |
Encuentra en el String las ocurrencias de a ó b. |
ab | Encuentra en el String todas las ocurrencias de 'a' seguido de una 'b'. |
Meta caracteres¶
Los siguientes metacaracteres tienen un significado predefinido y hacen que ciertos patrones comunes sean más fáciles de usar. Por ejemplo, puede usar \d
como definición simplificada para [0..9].
Regex | Descripción |
---|---|
\d | Cualquier dígito. Equivale a [0-9] |
\D | No dígito. Equivale a [^0-9] |
\s | Espacio en blanco. Equivale a [ \t\n\x0b\r\f] |
\S | No espacio en blanco. Equivale a [^\s] |
\w | Una letra mayúscula o minúscula, un dígito o el carácter _ . Equivale a [a-zA-Z0-9_] |
\W | Equivale a [^\w] |
\S+ | Varios caracteres que no son espacios en blanco |
\b | Límite de una palabra |
Cuantificadores Regex¶
Los cuantificadores especifican el número de ocurrencias de un carácter. Un cuantificador define con qué frecuencia puede ocurrir un elemento.
Regex | Descripción |
---|---|
* | Indica que ocurre 0 ó más veces. Equivale a {0,}. |
+ | Indica que ocurre 1 ó más veces. Equivale a {1,}. |
? | Indica que ocurre 0 ó 1 veces. Equivale a {0,1}. |
{X} | Indica que lo que va justo antes de las llaves {} se repite X número de veces. |
{X, Y} | Indica que lo que va justo antes de las llaves {} se repite mínimo X número de veces y máximo Y. |
*? | ? después de un cuantificador lo convierte en un cuantificador perezoso (lazy). Intenta encontrar la coincidencia más pequeña. Esto hace que la expresión regular se detenga en la primera coincidencia. |
En la documentación de Oracle podemos ver todas las clases de caracteres que hay para construir una expresión regular.
¡Entrena tus Regex!
A lo largo de Internet hay muchas webs que te permiten entrenar o revisar tus expresiones regulares. Una de ellas es Regex Crossword, que a través del juego, te permite profundizar en el mundo de las expresiones regulares.
Ejemplo de uso de expresión regular: teléfono móvil¶
//(+34) 655-555-555
String regexTelefono = "^([\\(]{1}[\\+]{1}34[\\)]{1}[ ]{1}[0-9]{3}[\\-]{1}[0-9]{3}[\\-]{1}[0-9]{3})$";
String t1 = "123456789";//no
String t2 = "(+35) 123456-789";//no
String t3 = "(+34) 123-456-789";//si
String t4 = "(+34)123-456-789";//no
System.out.println(t1.matches(regexTelefono));//false
System.out.println(t2.matches(regexTelefono));//false
System.out.println(t3.matches(regexTelefono));//true
System.out.println(t4.matches(regexTelefono));//false
Actividades¶
-
AC 811 (RA3 / CE3f CE3g CE3i / IC1 / 3p). Escribe una expresión regular que haga match tanto con el texto "He ido al cine.", como con "He ido al supermercado.". Verifica tu repuesta con el método de la clase
String
matches
. Una vez hecho usa el método de la claseMatcher
matches
para verificar las coincidencias (match
) en vez deString.matches
. -
AC 812 (RA3 / CE3f CE3g CE3i / IC1 / 3p). Reemplaza todos los espacios en blanco con una barra baja (_) en la siguiente cadena. Imprime el resultado. "Ciclo Formativo de Grado Superior de Desarrollo de Aplicaciones Web."
-
AC 813 (RA3 / CE3f CE3g CE3i / IC1 / 3p). Escribe una expresión regular que coincida con el código postal en España, utiliza "03207" como ejemplo.
-
AC 814 (RA3 / CE3f CE3g CE3i / IC1 / 3p). Escribe una expresión regular para validar el número de una tarjeta de crédito.
-
AC 815 (RA3 / CE3f CE3g CE3i / IC1 / 3p). Escribe una expresión regular para validar emails. Verifica "test2@gmail.com".
-
AC 816 (RA3 / CE3f CE3g CE3i / IC1 / 3p). Escribe una expresión regular para validar DNI. Verifica "61234181Q".