# Expresiones regulares (Regex)
En la vida de todo programador llega el momento de utilizar algo conocido como "Expresiones Regulares" (opens new window), un término que a simple vista no pareciera nada extraño hasta que te encuentras con:
[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+
Y te dicen que esa cosa rara es la expresión regular para validar un email 🤯.
TIP
Te recomiendo visitar este sitio llamado iHateRegex (opens new window) para conocer más acerca de expresiones regulares. Tiene una gran variedad de ellas y explica cada una de sus partes.
# Conceptos básicos
Según la MDN, las expresiones regulares son patrones que se utilizan para hacer coincidir combinaciones de caracteres en cadenas, es decir, con ellas podemos realizar búsquedas para validar o encontrar cierto conjunto de caracteres que puede incluir cualquier letra, número y/o símbolo.
Normalmente las expresiones regulares se escriben entre dos diagonales /.../
, aunque cada lenguaje de programación tiene su propia sintaxis.
TIP
Regex es un nombre corto que se le da a las expresiones regulares.
TIP
Puedes practicar con expresiones regulares en regex101 (opens new window). Tiene una interfaz amigable y permite validar tus expresiones en diferentes lenguajes como Javascript, Python, PHP y Java.
También puedes visualizar gráficamente tus expresiones regulares en cyrilex (opens new window). Tiene un genial generador de diagramas para identificar de manera más fácil los patrones.
# Buscar letras/palabras/frases
Para saber si una cadena de texto incluye la letra a
, es tan fácil como escribir /a/
. Así, si quisieras saber si una cadena incluye la palabra perro
, entonces sería /perro/
.
Como puedes ver, la búsqueda más sencilla se puede realizar simplemente escribiendo entre diagonales la letra, palabra o frase que necesitas.
'Este es el texto donde queremos realizar la búsqueda'
// Regex para buscar una frase.
/es el texto/
Este tipo de búsqueda es estricta, deben estar todos los caracteres presentes y justo en el orden que se indican. El lugar donde se encuentren no es importante aunque veremos que sí se puede especificar.
WARNING
Por defecto, las expresiones regulares son case-sensitive (sensibles a mayúsculas y minúsculas). Esto se puede cambiar pero tenlo en cuenta.
# Comodines
Los comodines son símbolos con significado especial, es decir, tendrán alguna función diferente a su valor como tal. Veamos una pequeña lista de estos comodines para que se entienda mejor:
. (punto)
Representa un caracter dentro de la regex.
/gat./
buscará cualquier palabra de 4 letras que comience congat
sin importar el cuarto caracter.Ejemplo:
gato, gata, gatx
* (asterisco)
Busca cero o más coincidencias.
/ba*/
buscará unab
sola o con cualquier número dea
juntas.Ejemplo:
b, ba, baa, baaa
+ (más)
Busca una o más coincidencias.
/ba+/
buscará unab
con al menos unaa
juntas.Ejemplo:
ba, baa, baaa
? (pregunta)
Busca una o ninguna coincidencia.
/solo?/
buscará la palabrasol
con unao
al final opcional.Ejemplo:
sol, solo
| (barra vertical)
Permite buscar un caracter(es) u otros.
/pala|palo/
buscará la palabrapala
opalo
.Ejemplo:
pala, palo
^ (acento circunflejo)
Busca los caracteres al inicio de la cadena.
/^el/
buscará la palabrael
solo al inicio de la oración.Ejemplo:
el perro es el mejor amigo del hombre
$ (pesos)
Busca los caracteres al final de la cadena.
/sobre$/
buscará la palabrasobre
al final de la oración.Ejemplo:
sobre la mesa está el sobre
{} (llaves)
Buscará un cierto número de caracteres.
/a{1}/
buscará solo una letraa
.Ejemplo:
a
/a{1,3}/
buscará de una a tres letrasa
.Ejemplo:
a, aa, aaa
/a{1,}/
buscará al menos una letraa
.Ejemplo:
a, aa, aaa, aaaa
() (paréntesis)
Agrupa caracteres y guarda cada grupo por separado.
/pal(a|o)/
buscará la palabrapal
con terminacióna
óo
y guardará dos grupos.Ejemplo:
la pala está hecha con un palo
Coincidencias: pala, palo
Grupo 1: a
Grupo 2: o
[] (corchetes)
Buscará cualquier caracter de un conjunto de caracteres.
/pal[ao]/
buscará la palabrapal
con terminacióna
óo
.Ejemplo:
la pala está hecha con un palo
Coincidencias: pala, palo
TIP
También existe la posibilidad de definir el conjunto de caracteres que no queremos encontrar. Para esto se utiliza el
^
al inicio del conjunto.Por ejemplo, si queremos validar que una cadena no contenga algunos caracteres especiales, podemos escribir
/[^#@+-&]/
.
- (guión)
Permite crear un conjunto de caracteres de forma simplificada.
/[a-z]/
buscará cualquier letra del abecedario en minúsculas./[A-Z]/
buscará cualquier letra del abecedario en mayúsculas./[0-9]/
buscará cualquier dígito.
# Caracteres de escape
Existen algunos caracteres de escape que representan conjuntos o caracteres especiales, esto nos ayuda a escribir expresiones regulares más sencillas de leer.
/\d/ | /[0-9]/
Cualquier dígito
|
/\D/ | /[^0-9]/
Cualquier caracter que no sea dígito
|
/\w/ | /[A-Za-z0-9_]/
Cualquier letra mayúscula o minúscula, dígito o guión bajo
|
/\W/ | /[^A-Za-z0-9_]/
Cualquier caracter que no sea letra mayúscula o minúscula, dígito o guión bajo
|
/\s/ | Cualquier tipo de espacio (incluye tabulación) |
/\S/ | Cualquier caracter que no sea de tipo de espacio |
/\t/ | Tabulación horizontal |
/\r/ | Retorno de carro |
/\n/ | Salto de línea |
/\/ |
Escapa caracteres para darles un significado especial o diferente al que normalmente tienen.
Ejemplo:
Para escapar la diagonal invertida, debes duplicarla: /\\/ |
# Modificadores / banderas
Los modificadores son parámetros especiales que alteran la expresión regular en general. Estos se escriben justo a lado de la diagonal de cierre /.../<modificador>
.
g (global)
Busca todas las coincidencias.
Ejemplo:
/el/ el carro rojo es el más veloz
/el/g el carro rojo es el más veloz
WARNING
Por defecto, las expresiones regulares solo buscarán la primera coincidencia.
m (multilínea)
Busca las coincidencias por línea en el texto usando los comodines
^
y$
.Ejemplo:
/línea$/ Esta es la primera línea
Esta es la segunda línea/línea$/m Esta es la primera línea
Esta es la segunda líneaWARNING
Por defecto, las expresiones regulares solo buscarán coincidencias al inicio o fin del texto total.
i (case-insensitive)
Busca las coincidencias sin importar mayúsculas y minúsculas.
Ejemplo:
/el/ el carro rojo es el más veloz
/el/i El carro rojo es el más veloz
WARNING
Por defecto, las expresiones regulares harán distinción entre mayúsculas y minúsculas.
# Condicionales
En ocasiones lo que requieres es validar que un conjunto de caracteres se encuentre antes o después de otro cierto grupo de caracteres, es decir, una búsqueda condicional. Las expresiones regulares también cuentan con una sintaxis especial para esto.
# Búsqueda hacia adelante
Este tipo de búsqueda verificará los caracteres a la derecha del conjunto a buscar.
Positiva
/(?=...)/
/a(?=b)/
encontrá laa
enab
pero no enac
.Negativa
/(?!...)/
/a(?!b)/
encontrá laa
enac
pero no enab
.
# Búsqueda hacia atrás
Este tipo de búsqueda verificará los caracteres a la izquierda del conjunto a buscar.
Positiva
/(?<=...)/
/(?<=b)a/
encontrá laa
enba
pero no enca
.Negativa
/(?<!...)/
/(?<!b)a/
encontrá laa
enca
pero no enba
.
# Ejemplos
Finalmente, analicemos algunas de las expresiones regulares más comunes para clarificar todo lo visto hasta ahora.
# Validar nombre de usuario
Acepta letras, números y guiones. Mínimo 3 y máximo 15.
/^[a-z0-9_-]{3,15}$/
Expresión | Significado / Uso |
---|---|
/^/ | Indica inicio de línea |
/[a-z0-9_-]/ | Letras minúsculas, números, guión bajo y guión medio |
/{3,15}/ | Deben encontrarse de 3 a 15 caracteres |
/$/ | Indica fin de línea |
# Validar email
Posiblemente de las más raras pero más fáciles.
/[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+/
Expresión | Significado / Uso |
---|---|
/[^@ \t\r\n]+/ |
Cualquier caracter que no sea un arroba, un espacio, una tabulación, un retorno de carro o un salto de línea
(Mínimo 1) |
/@/ | Signo de arroba |
/\./ | Escapa el punto |
# Validar contraseña
Al menos debe contener una mayúscula, una minúscula, un número y un caracter especial. Mínimo 8.
/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,}$/
Expresión | Significado / Uso |
---|---|
/^/ | Indica inicio de línea |
/(?=.*?[A-Z])/ | Busca al menos una letra mayúscula |
/(?=.*?[a-z])/ | Busca al menos una letra minúscula |
/(?=.*?[0-9])/ | Busca al menos un número |
/(?=.*?[#?!@$ %^&*-])/ | Busca al menos un caracter especial |
/.{8,}/ | Cualquier caracter. Mínimo 8 |
/$/ | Indica fin de línea |
TIP
Aquí encontramos una combinación especial de comodines: .*?
Te dejo esta pregunta de StackOverflow (opens new window) donde explican a detalle su funcionamiento (lectura en inglés).
# Conclusión
Si hasta aquí no has comprendido nada, no te preocupes, es un tema que a todos nos cuesta trabajo entender en un principio (la verdad es que no es una sintaxis muy amigable) pero las expresiones regulares pueden ayudarte en muchísimas cosas.
Te recomiendo que practiques e investigues la teoría de cada componente, después de unos cuantos ejercicios no te prometo que dejen de ser feas pero sí serán más comprensibles 😅.
Happy coding! 🥸