Desarrollo10 min de lectura

Expresiones Regulares (Regex): Guía para Principiantes

Las expresiones regulares son una de las herramientas más poderosas en la caja de un desarrollador. Con ellas puedes buscar, validar y transformar texto con una sola línea de código. Aprende desde cero.

1. ¿Qué Son las Expresiones Regulares?

Una expresión regular (regex o regexp) es un patrón de búsqueda que describe un conjunto de cadenas de texto. Es como un lenguaje de búsqueda avanzado: en lugar de buscar una palabra exacta, puedes definir un patrón que coincida con múltiples variantes.

Por ejemplo, si necesitas encontrar todos los números de teléfono en un documento, no puedes buscar un número específico — necesitas un patrón que describa cómo se ve un número de teléfono en general. Eso es exactamente lo que hace una regex.

Usos más comunes de las expresiones regulares:

  • Validación: Verificar que un email, URL, teléfono o código postal tiene el formato correcto.
  • Búsqueda: Encontrar patrones específicos en textos largos (logs, código fuente, documentos).
  • Extracción: Capturar partes específicas de un texto (como extraer el dominio de una URL).
  • Reemplazo: Sustituir patrones de texto (como cambiar todos los formatos de fecha).

2. Sintaxis Básica: Caracteres y Metacaracteres

La mayoría de caracteres en una regex se representan a sí mismos. La letra "a" coincide con la letra "a", el número "5" coincide con "5". Pero hay caracteres especiales (metacaracteres) que tienen significados especiales:

  • . (punto): Coincide con cualquier carácter excepto salto de línea. Ejemplo: c.t coincide con "cat", "cut", "c3t".
  • \ (barra invertida): Escapa un metacarácter para tratarlo como literal. Ejemplo: \. coincide con un punto literal.
  • | (pipe): Alternancia (OR). Ejemplo: gato|perro coincide con "gato" o "perro".
  • ^ (circunflejo): Inicio de línea. Ejemplo: ^Hola coincide con "Hola" solo al principio.
  • $ (dólar): Fin de línea. Ejemplo: fin$ coincide con "fin" solo al final.

Atajos de clases

  • \d: Cualquier dígito (equivalente a [0-9]).
  • \w: Cualquier carácter de "palabra" (letras, dígitos, guion bajo: [a-zA-Z0-9_]).
  • \s: Cualquier espacio en blanco (espacio, tab, salto de línea).
  • \D, \W, \S: Las versiones negadas — cualquier carácter que NO sea dígito, palabra o espacio.

3. Cuantificadores: ¿Cuántas Veces?

Los cuantificadores definen cuántas repeticiones del elemento anterior se permiten:

  • * (asterisco): Cero o más veces. a* → "", "a", "aa", "aaa"...
  • + (más): Una o más veces. a+ → "a", "aa", "aaa"... (no vacío).
  • ? (interrogación): Cero o una vez (opcional). colou?r → "color" o "colour".
  • {n}: Exactamente n veces. \d{3} → exactamente 3 dígitos.
  • {n,m}: Entre n y m veces. \d{2,4} → entre 2 y 4 dígitos.
  • {n,}: Al menos n veces. \d{2, → 2 o más dígitos.

Cuantificadores greedy vs lazy

Por defecto, los cuantificadores son "greedy" (codiciosos) — coinciden con la mayor cantidad posible de caracteres. Añade "?" después del cuantificador para hacerlo "lazy" (perezoso):

Texto: "<b>hola</b> y <b>mundo</b>"
Patrón greedy: <b>.*</b> → coincide con todo el texto desde el primer <b> hasta el último </b>
Patrón lazy: <b>.*?</b> → coincide con <b>hola</b> y <b>mundo</b> por separado

4. Clases de Caracteres y Rangos

Los corchetes [ ] definen un conjunto de caracteres válidos para una posición:

  • [abc]: Coincide con "a", "b" o "c".
  • [a-z]: Cualquier letra minúscula de la a a la z.
  • [A-Z]: Cualquier letra mayúscula.
  • [0-9]: Cualquier dígito (equivalente a \d).
  • [a-zA-Z0-9]: Cualquier letra o dígito.
  • [^abc]: Cualquier carácter EXCEPTO "a", "b" o "c" (negación con ^).

Dentro de los corchetes, la mayoría de metacaracteres pierden su significado especial. Solo necesitas escapar: ] (cierre), \ (barra), ^ (si está al inicio) y - (si está entre caracteres).

5. Grupos de Captura y Alternancia

Los paréntesis ( ) crean grupos de captura que permiten agrupar partes del patrón y extraer subcadenas del texto coincidente:

  • (abc): Grupo de captura — coincide con "abc" y recuerda la coincidencia.
  • (?:abc): Grupo sin captura — agrupa pero no recuerda (más eficiente si no necesitas extraer).
  • (a|b): Alternancia dentro de un grupo — coincide con "a" o "b".
  • \1: Referencia hacia atrás — coincide con lo mismo que capturó el grupo 1.

Ejemplo práctico: Para extraer el protocolo y dominio de una URL:
Patrón: (https?)://([\w.-]+)
Texto: "https://linkslin.com"
Grupo 1: "https" | Grupo 2: "linkslin.com"

6. Anclas y Límites

Las anclas no coinciden con caracteres, sino con posiciones en el texto:

  • ^: Inicio de línea (o inicio de cadena con flag /m).
  • $: Fin de línea.
  • \b: Límite de palabra — la posición entre un carácter de palabra (\w) y uno que no lo es (\W).
  • \B: NO es límite de palabra.

\b es especialmente útil: \bgato\b coincide con "gato" como palabra completa pero no con "gatonegro" o "ungato". Sin \b, el patrón "gato" coincidiría también dentro de esas palabras.

7. Patrones Útiles del Mundo Real

Estos son patrones regex que todo desarrollador debería conocer:

  • Email básico: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
    Valida la estructura básica de un email. No cubre todos los casos del RFC 5322 pero funciona para el 99% de emails reales.
  • URL: https?://[\w.-]+(?:/[\w./-]*)?
    Coincide con URLs HTTP y HTTPS básicas.
  • Teléfono (formato español): (?:\+34)?[6-9]\d{8}
    Coincide con números de teléfono españoles con o sin prefijo +34.
  • Dirección IP v4: \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
    Coincide con el formato de dirección IPv4 (sin validar que los octetos estén en rango 0-255).
  • Fecha (dd/mm/aaaa): \d{2}/\d{2}/\d{4}
    Formato de fecha europeo básico.
  • Color hexadecimal: #([0-9a-fA-F]{3}|[0-9a-fA-F]{6})
    Coincide con colores CSS hex de 3 o 6 dígitos.

Prueba todos estos patrones en nuestro tester de regex online para ver cómo funcionan con diferentes textos de ejemplo.

8. Errores Comunes y Cómo Evitarlos

  • No escapar metacaracteres: Si quieres buscar un punto literal, usa \. en lugar de . (que coincide con cualquier carácter).
  • Patrones demasiado amplios: .* coincide con casi todo. Sé más específico: usa clases de caracteres como [a-z]+ o \d+ en lugar de .*.
  • Olvidar las anclas: Sin ^ y $, el patrón puede coincidir parcialmente dentro de un texto más largo. Si validas un campo completo, usa ^patron$.
  • Catastrophic backtracking: Patrones como (a+)+ sobre texto que no coincide causan un crecimiento exponencial de intentos. Evita cuantificadores anidados sobre elementos similares.
  • No considerar Unicode: \w y \d por defecto solo cubren ASCII. Para texto con acentos o caracteres de otros idiomas, usa flags Unicode o clases explícitas como [a-záéíóúñü].

Preguntas Frecuentes

¿Qué lenguajes de programación soportan expresiones regulares?

Prácticamente todos los lenguajes modernos soportan regex: JavaScript, Python, Java, C#, PHP, Ruby, Go, Rust, Swift, Kotlin, y más. La sintaxis es muy similar entre lenguajes (basada en PCRE - Perl Compatible Regular Expressions), con pequeñas variaciones en funciones avanzadas como lookbehinds o named groups.

¿Las expresiones regulares son lentas?

Depende del patrón y del motor. Los patrones simples son extremadamente rápidos. Los problemas de rendimiento aparecen con "catastrophic backtracking" — patrones ambiguos con cuantificadores anidados como (a+)+ sobre textos que no coinciden. Para evitarlo, sé específico en tus patrones y evita cuantificadores anidados sobre el mismo tipo de carácter.

¿Puedo usar regex para parsear HTML?

No es recomendable. HTML es un lenguaje de contexto libre que no puede ser parseado correctamente con expresiones regulares (que son lenguajes regulares). Para extraer datos simples de HTML puede funcionar, pero para procesamiento robusto usa un parser HTML como DOMParser en JavaScript o BeautifulSoup en Python.

¿Cuál es la diferencia entre * y + en regex?

El asterisco (*) coincide con cero o más repeticiones del elemento anterior — permite que no haya ninguna coincidencia. El signo más (+) requiere al menos una coincidencia. Por ejemplo: a* coincide con "" (vacío) y "aaa", mientras que a+ solo coincide con "a", "aa", "aaa" pero no con una cadena vacía.

¿Cómo puedo probar mis expresiones regulares antes de usarlas en código?

Usa un tester de regex online como el que ofrecemos en LinksLin. Estos testers te permiten escribir tu patrón, introducir texto de prueba y ver las coincidencias resaltadas en tiempo real. También muestran los grupos de captura y explican qué hace cada parte del patrón.

Practica Tus Expresiones Regulares

Prueba tus patrones regex en tiempo real con nuestro tester online gratuito. Resaltado de coincidencias, grupos de captura y más.