Expresiones regulares
2 minutos de lectura
Fecha: 2/1/2018
Las expresiones regulares son tan útiles como difíciles de entender en muchos casos, gracias a ellas podemos encontrar patrones en una cadena de texto.
Raro es encontrarse un programador que diga que las expresiones regulares no son eficaces, como también es poco común encontrar a gente que viendo un patrón sea capaz de crearlas al vuelo.
Esto se debe a que su sintaxis no es sencilla, y las expresiones regulares complejas requieren de bastante trabajo.
No hay recetas mágicas para construirlas pero particularmente me han ayudado bastante algunas cheat sheets que explican su sintaxis, así que he traducido una para que la podáis consultar.
Cheatsheet
Anclajes | |
---|---|
^ | Comienzo de un string, o de una linea en un patrón multilinea |
\A | Comienzo de un string |
$ | Final de un string, o de una linea en un patrón multilinea |
\Z | Final de un string |
\b | Límite de palabra |
\B | No límite de palabra |
\< | Comienzo de palabra |
\> | Final de palabra |
Clases de caracteres | |
---|---|
\c | Caracter de control |
\s | Espacio en blanco |
\S | No espacio en blanco |
\d | Dígito |
\D | No dígito |
\w | Palabra |
\W | No palabra |
\x | Dígito hexadecimal |
\O | Dígito octal |
Cuantificadores | |
---|---|
* | Cero o más ocurrencias |
+ | Una o más ocurrencias |
? | Cero o una ocurrencia |
{n} | n ocurrencias |
{n,} | n ocurrencias o más |
{n,m} | al menos n ocurrencias y máximo m ocurrencias |
Caracteres especiales | |
---|---|
\n | Salto de linea |
\r | Retorno de carro |
\t | Tabulación horizontal |
\v | Tabulación vertical |
\f | Caracter de avance de formulario |
\xxx | Caracter octal |
\xhh | Caracter hexadecimal |
Agrupaciones | |
---|---|
. | Cualquier caracter salvo el salto de linea (\n) |
(a|b) | a o b |
(…) | Grupo |
[abc] | Rango (en este caso a, b o c) |
[^abc] | Fuera del rango (en este caso que no sea a, b o c) |
[a-q] | Rango de letras minúsculas |
[A-Q] | Rango de letras mayúsculas |
[0-7] | Rango de números |
Modificadores | |
---|---|
g | Búsqueda global |
i * | No sensible a mayúsculas/minúsculas |
m * | Múltiples líneas |
Aserciones | |
---|---|
?= | Si el predicado futuro coincide |
?! | Si el predicado futuro no coincide |
?() | Condicional If |
?()| | Condicional If/Else |
Vistas las tablas y para hacernos una idea, esta es una expresión regular típica.
^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$
¿Qué es lo que comprueba?
Podemos analizar brevemente los bloques que tiene:
- Lo primero que vemos es
^
que quiere decir «que comience por». - Luego esta el grupo
[a-zA-Z0-9.!#$%&'*+/=?^_``{|}~-]
que como se aprecia permite cualquier letra minúscula o mayúscula, cualquier dígito y un buen número de caracteres especiales, así que puede comenzar por todo esto. - A continuación tenemos un
+
que obliga a que a continuación tenga que existir una o más veces el caracter@
- Después volvemos a tener otro grupo, en este caso
[a-zA-Z0-9-]
que permite letras, dígitos y el guión medio. - Por último tenemos otro
+
y un grupo(?:\.[a-zA-Z0-9-]+)*$
que obliga a que se termine con un.
y otro caracter que sea letra, dígito o el guión medio.
Este es el patrón para comprobar direcciones de correo electrónico propuesto por la w3c, podéis verlo aquí.
Este es muy poco restrictivo y no lo recomiendo usar, pero sirve como ejemplo básico de una expresión regular para filtrar emails.