GarToolsPremium Tools
Desarrollo

Expresiones regulares (Regex): guía práctica con ejemplos reales

Aprende a usar expresiones regulares desde cero. Guía con ejemplos prácticos en JavaScript, Python y herramientas online para validar, buscar y reemplazar texto.

Por Ferran Garola Bonilla8 min de lectura
Imagen ilustrativa del artículo: Expresiones regulares (Regex): guía práctica con ejemplos reales
Compartir

¿Qué son las expresiones regulares?

Las expresiones regulares (regex o regexp) son patrones de texto que describen conjuntos de cadenas de caracteres. Son una de las herramientas más potentes y universales en programación: permiten buscar, validar, extraer y reemplazar texto con una precisión imposible de conseguir con búsquedas simples.

Nacieron en los años 50 como concepto matemático (autómatas finitos) y se incorporaron a la informática a través de editores de texto Unix como ed y grep. Hoy están integradas en prácticamente todos los lenguajes de programación, editores de código, bases de datos y herramientas de línea de comandos.

Si alguna vez has necesitado verificar que un email tiene formato válido, extraer todos los números de un documento, o reemplazar fechas de un formato a otro, las regex son la solución óptima.

Sintaxis básica: los bloques fundamentales

Caracteres literales y metacaracteres

Un patrón regex puede contener caracteres literales (que coinciden consigo mismos) y metacaracteres (que tienen significado especial):

MetacarácterSignificadoEjemplo
.Cualquier carácter excepto salto de líneaa.c coincide con "abc", "a1c", "a-c"
^Inicio de línea^Hola coincide con "Hola mundo"
$Fin de líneafin$ coincide con "es el fin"
*Cero o más repeticionesab*c coincide con "ac", "abc", "abbc"
+Una o más repeticionesab+c coincide con "abc", "abbc" pero no "ac"
?Cero o una repeticióncolou?r coincide con "color" y "colour"
\Escape de metacarácter\. coincide con un punto literal

Clases de caracteres

Las clases de caracteres definen conjuntos de caracteres aceptables en una posición:

  • [abc] — coincide con "a", "b" o "c"
  • [a-z] — cualquier minúscula
  • [A-Z0-9] — cualquier mayúscula o dígito
  • [^abc] — cualquier carácter excepto "a", "b" o "c" (negación)

Los atajos predefinidos ahorran tiempo:

  • \d — equivale a [0-9] (dígito)
  • \w — equivale a [a-zA-Z0-9_] (carácter de "palabra")
  • \s — equivale a [ \t\n\r] (espacio en blanco)
  • \D, \W, \S — las negaciones respectivas

Cuantificadores específicos

Cuando necesitas repeticiones exactas:

  • {3} — exactamente 3 repeticiones
  • {2,5} — entre 2 y 5 repeticiones
  • {3,} — 3 o más repeticiones

Ejemplo: \d{2}/\d{2}/\d{4} coincide con fechas como "25/03/2026".

Grupos y alternancia

  • (abc) — grupo de captura: agrupa y captura el contenido
  • (?:abc) — grupo sin captura: agrupa sin capturar
  • a|b — alternancia: coincide con "a" o con "b"

Ejemplo: (gato|perro)s? coincide con "gato", "gatos", "perro", "perros".

Ejemplos prácticos esenciales

Validar un email (simplificado)

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

Este patrón verifica la estructura básica de un email: caracteres válidos antes de la @, dominio con puntos, y extensión de al menos 2 caracteres. La validación completa de emails según RFC 5322 es extremadamente compleja, pero este patrón cubre el 99.9% de los casos reales.

Extraer URLs de un texto

https?://[^\s<>"']+

Coincide con URLs que empiezan por http o https, seguidas de cualquier carácter que no sea espacio ni ciertos delimitadores.

Validar un teléfono español

^(\+34)?[\s-]?[6789]\d{8}$

Acepta formatos como "+34 612345678", "612345678", "912345678" (fijos y móviles españoles).

Buscar direcciones IP

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

Encuentra patrones tipo "192.168.1.1". Los \b son límites de palabra para evitar coincidencias parciales dentro de números más largos.

Reemplazar formato de fecha

Para convertir "2026-03-25" a "25/03/2026" en JavaScript:

const texto = "Fecha: 2026-03-25";
const resultado = texto.replace(
  /(\d{4})-(\d{2})-(\d{2})/g,
  "$3/$2/$1"
);
// "Fecha: 25/03/2026"

Los grupos de captura () se referencian con $1, $2, $3 en la cadena de reemplazo.

Regex en JavaScript

JavaScript integra regex de forma nativa:

// Crear regex
const regex1 = /patron/flags;
const regex2 = new RegExp("patron", "flags");

// Métodos principales
regex.test(string)      // true/false
string.match(regex)     // array de coincidencias
string.replace(regex, reemplazo)
string.split(regex)

// Flags comunes
// g - global (todas las coincidencias)
// i - case insensitive
// m - multilinea
// s - dotAll (el . incluye \n)

Ejemplo real: extraer hashtags

const texto = "Me encanta #JavaScript y #WebDev para el #frontend";
const hashtags = texto.match(/#[\w\u00C0-\u024F]+/g);
// ["#JavaScript", "#WebDev", "#frontend"]

El rango \u00C0-\u024F incluye caracteres acentuados, necesarios para idiomas como el español.

Regex en Python

Python usa el módulo re:

import re

# Buscar primera coincidencia
match = re.search(r'\d+', 'Hay 42 elementos')
if match:
    print(match.group())  # "42"

# Todas las coincidencias
numeros = re.findall(r'\d+', 'Hay 42 de 100 elementos')
# ['42', '100']

# Reemplazar
limpio = re.sub(r'\s+', ' ', 'texto   con   espacios')
# "texto con espacios"

# Compilar para rendimiento
patron = re.compile(r'^[a-z]+$', re.IGNORECASE)
patron.match("Hola")  # Match object

Errores comunes y cómo evitarlos

  1. Olvidar escapar metacaracteres. Si buscas un punto literal, usa \. y no .. El punto sin escapar coincide con cualquier carácter.

  2. Cuantificadores codiciosos vs perezosos. Por defecto, * y + son codiciosos (consumen lo máximo posible). Añade ? para hacerlos perezosos: .*? consume lo mínimo necesario. Esto es crucial al extraer contenido entre delimitadores.

  3. No anclar el patrón. Sin ^ y $, tu patrón de validación puede coincidir con una subcadena en lugar del texto completo. \d{9} coincide dentro de "abc123456789xyz", pero ^\d{9}$ solo con exactamente 9 dígitos.

  4. Backtracking catastrófico. Patrones con cuantificadores anidados como (a+)+$ pueden provocar tiempos de ejecución exponenciales. Evita patrones donde un cuantificador contiene otro que coincide con los mismos caracteres.

  5. No usar raw strings en Python. Siempre usa r'patron' para evitar que Python interprete las barras invertidas antes de que lleguen al motor regex.

Herramientas para aprender y probar regex

Probar regex en un editor de texto es lento e ineficiente. Usa herramientas dedicadas:

  • GarTools Testador de Regex — nuestro testador de regex online te muestra coincidencias en tiempo real directamente en tu navegador, con total privacidad.
  • Regex101 — popular herramienta online con explicación paso a paso del patrón y referencia de sintaxis.
  • RegExr — visualización interactiva de coincidencias con biblioteca de patrones comunitarios.

Rendimiento y optimizacion de regex

Las expresiones regulares mal escritas pueden convertirse en un cuello de botella serio de rendimiento. El problema mas comun es el backtracking catastrofico, donde el motor regex explora un numero exponencial de caminos antes de determinar que no hay coincidencia. Esto puede bloquear un hilo del servidor durante segundos o incluso minutos con inputs especificos.

Para evitar problemas de rendimiento, sigue estas practicas: usa cuantificadores posesivos o atomic groups cuando tu motor los soporte, evita patrones con cuantificadores anidados que coincidan con los mismos caracteres, y establece limites de tiempo (timeouts) cuando ejecutes regex sobre inputs de usuarios no confiables. En JavaScript, puedes usar la flag d para obtener indices de coincidencia y en Python puedes usar re.compile() para compilar patrones que se reutilizan frecuentemente.

Otro aspecto importante es la legibilidad. Una regex compleja puede ser correcta pero imposible de mantener si nadie entiende que hace. Usa la flag x (modo verbose) disponible en Python y otros lenguajes para añadir comentarios y espacios dentro del patron. Divide regex complejas en partes nombradas usando grupos con nombre. Y siempre documenta las regex no triviales con un comentario que explique que patron buscan y por que.

Casos de uso avanzados

Validacion de formularios en frontend

Las regex son la base de la validacion de formularios web. Los atributos pattern de HTML5 aceptan expresiones regulares directamente, lo que permite validar formatos sin JavaScript. Sin embargo, la validacion en frontend es solo una primera linea de defensa para mejorar la experiencia de usuario: siempre valida tambien en el backend porque el frontend puede ser manipulado.

Procesamiento de logs y datos

En administracion de sistemas y analisis de datos, las regex son indispensables para extraer informacion de archivos de log. Herramientas como grep, awk y sed en Linux usan regex intensivamente. Combinadas con pipes, permiten filtrar miles de lineas de log en segundos para encontrar errores, patrones de acceso o anomalias.

Los analistas de datos usan regex en pandas (Python) para limpiar y transformar columnas de texto: extraer codigos postales de direcciones, normalizar numeros de telefono, separar nombres y apellidos, o detectar patrones en comentarios de clientes. La funcion str.extract() de pandas acepta regex con grupos de captura y devuelve un DataFrame limpio.

Buscar y reemplazar en editores de codigo

Todos los editores de codigo modernos soportan buscar y reemplazar con regex. Esto permite refactorizaciones masivas que serian imposibles con busqueda literal. Por ejemplo, puedes renombrar todas las variables que sigan un patron, reordenar parametros de funciones, convertir strings concatenados a template literals, o transformar imports de un formato a otro. En VS Code, activa el icono de regex (.*) en la barra de busqueda para habilitar esta funcionalidad.

Web scraping y extraccion de datos

Aunque los parsers HTML dedicados (como BeautifulSoup o Cheerio) son preferibles para scraping estructurado, las regex siguen siendo utiles para extraer datos de texto no estructurado: emails dentro de paginas, precios en formatos variados, fechas en multiples formatos o identificadores especificos. La clave es no intentar parsear HTML completo con regex (un anti-patron famoso) sino usarlas para extraer datos puntuales de texto ya obtenido.

Conclusión

Las expresiones regulares son una habilidad fundamental para cualquier persona que trabaje con texto y datos. Aunque la curva de aprendizaje puede parecer empinada, dominar los conceptos básicos (clases de caracteres, cuantificadores, grupos y anclas) cubre el 90% de los casos de uso reales. Practica con nuestro testador de regex y guarda tus patrones más útiles como referencia.

¿Te ha sido útil este artículo?

Suscríbete a la newsletter mensual: un correo cuando publicamos algo igual de útil. Sin spam.

¿Te ha gustado?
Compártelo con alguien a quien le pueda ser útil.

Los comentarios se activarán próximamente. ¿Quieres compartir algo sobre este artículo? Escríbenos en /contacto.

Continuar leyendo
Volver al blog