"El buen diseño es obvio. El gran diseño es transparente"
- Joe Sparano

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
\AComienzo de un string
$Final de un string, o de una linea en un patrón multilinea
\ZFinal de un string
\bLímite de palabra
\BNo límite de palabra
\<Comienzo de palabra
\>Final de palabra
Clases de caracteres
\cCaracter de control
\sEspacio en blanco
\SNo espacio en blanco
\dDígito
\DNo dígito
\wPalabra
\WNo palabra
\xDígito hexadecimal
\ODí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
\nSalto de linea
\rRetorno de carro
\tTabulación horizontal
\vTabulación vertical
\fCaracter de avance de formulario
\xxxCaracter octal
\xhhCaracter 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
gBú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.!#$%&amp;'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$

¿Qué es lo que comprueba?

Podemos analizar brevemente los bloques que tiene:

  1. Lo primero que vemos es ^ que quiere decir «que comience por».
  2. 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.
  3. A continuación tenemos un + que obliga a que a continuación tenga que existir una o más veces el caracter @
  4. Después volvemos a tener otro grupo, en este caso [a-zA-Z0-9-] que permite letras, dígitos y el guión medio.
  5. 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.