# 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 🤯.

Scared

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 con gat sin importar el cuarto caracter.

    Ejemplo: gato, gata, gatx


  • * (asterisco)

    Busca cero o más coincidencias.

    /ba*/ buscará una b sola o con cualquier número de a juntas.

    Ejemplo: b, ba, baa, baaa


  • + (más)

    Busca una o más coincidencias.

    /ba+/ buscará una b con al menos una a juntas.

    Ejemplo: ba, baa, baaa


  • ? (pregunta)

    Busca una o ninguna coincidencia.

    /solo?/ buscará la palabra sol con una o al final opcional.

    Ejemplo: sol, solo


  • | (barra vertical)

    Permite buscar un caracter(es) u otros.

    /pala|palo/ buscará la palabra pala o palo.

    Ejemplo: pala, palo


  • ^ (acento circunflejo)

    Busca los caracteres al inicio de la cadena.

    /^el/ buscará la palabra el 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 palabra sobre 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 letra a.

    Ejemplo: a

    /a{1,3}/ buscará de una a tres letras a.

    Ejemplo: a, aa, aaa

    /a{1,}/ buscará al menos una letra a.

    Ejemplo: a, aa, aaa, aaaa


  • () (paréntesis)

    Agrupa caracteres y guarda cada grupo por separado.

    /pal(a|o)/ buscará la palabra pal con terminación a ó 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 palabra pal con terminación a ó 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:
  • /1+2/ buscará al menos un 1 seguido de un 2.
  • /1\+2/ buscará la suma 1+2.

  • /d/ buscará una letra d.
  • /\d/ buscará un dígito.

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ínea

    WARNING

    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á la a en ab pero no en ac.

  • Negativa /(?!...)/

    /a(?!b)/ encontrá la a en ac pero no en ab.

# Búsqueda hacia atrás

Este tipo de búsqueda verificará los caracteres a la izquierda del conjunto a buscar.

  • Positiva /(?<=...)/

    /(?<=b)a/ encontrá la a en ba pero no en ca.

  • Negativa /(?<!...)/

    /(?<!b)a/ encontrá la a en ca pero no en ba.

# 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! 🥸