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?
¿Las expresiones regulares son lentas?
¿Puedo usar regex para parsear HTML?
¿Cuál es la diferencia entre * y + en regex?
¿Cómo puedo probar mis expresiones regulares antes de usarlas en código?
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.