GarToolsPremium Tools
Desarrollo20 de marzo de 202611 min

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

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.

intaxis básica: los bloques fundamentales

aracteres literales y metacaracteres

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

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

lases 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
  • uantificadores 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".

    rupos 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".

    jemplos prácticos esenciales

    alidar 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.

    xtraer 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.

    alidar un teléfono español

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

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

    uscar 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.

    eemplazar 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.

    egex 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)
    

    jemplo 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.

    egex 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
    

    rrores comunes y cómo evitarlos

  • Olvidar escapar metacaracteres. Si buscas un punto literal, usa \. y no .. El punto sin escapar coincide con cualquier carácter.
  • 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.
  • 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.
  • 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.
  • 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.
  • erramientas 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.
  • onclusió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.

    Artículos relacionados

    Volver al blog