GarToolsPremium Tools

Testador de Expresiones Regulares

Prueba expresiones regulares en tiempo real.

Por Ferran Garola BonillaDesarrollador full-stack de GarToolsActualizado: ECMAScript RegExp (ECMA-262)
Procesamiento local Resultado instantáneo 100% gratuito
//

¿Qué son las expresiones regulares y para qué sirven?

Las expresiones regulares (conocidas como regex o regexp) son un lenguaje formal para describir patrones de texto. Funcionan como un mini lenguaje de programación especializado en la búsqueda y manipulación de cadenas. Nacieron en los años 50 a partir del trabajo del matemático Stephen Kleene sobre autómatas y lenguajes regulares, y desde entonces se han convertido en una herramienta fundamental en informática. Hoy en día se utilizan en prácticamente todos los lenguajes de programación, editores de código, herramientas de línea de comandos (grep, sed, awk), sistemas de validación de formularios, motores de búsqueda, firewalls de aplicaciones web y mucho más. Su versatilidad las convierte en una habilidad imprescindible para cualquier desarrollador o profesional técnico.

Sintaxis básica de regex: lo esencial

La sintaxis de las expresiones regulares se compone de varios elementos fundamentales. Las clases de caracteres definen conjuntos: [abc] coincide con a, b o c; [a-z] con cualquier minúscula; \d con cualquier dígito (equivale a [0-9]); \w con cualquier carácter alfanumérico; y \s con cualquier espacio en blanco. Los cuantificadores controlan las repeticiones: * (cero o más), + (uno o más), ? (cero o uno), {n} (exactamente n), {n,m} (entre n y m). Las anclas indican posición: ^ marca el inicio del texto o línea y $ el final. Los grupos con paréntesis () permiten capturar subcadenas y aplicar cuantificadores a bloques completos. Las alternativas con |funcionan como un "o" lógico. Combinando estos elementos puedes describir patrones de cualquier complejidad.

Patrones regex más útiles en la práctica

Algunos 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 general de una dirección de correo. URL: https?://[^\s]+ detecta enlaces HTTP y HTTPS en un texto. Dirección IP v4: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} encuentra direcciones IP (aunque no valida que cada octeto sea menor a 256). Número de teléfono: \+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4} cubre formatos internacionales comunes. Fecha: \d{2}/\d{2}/\d{4} para formato DD/MM/AAAA. Es importante recordar que estos patrones son aproximaciones; para validación estricta en producción, combínalos con lógica adicional en tu código.

Sabores de regex: JavaScript, Python y POSIX

No todas las implementaciones de regex son iguales. Cada lenguaje y herramienta tiene su propio "sabor" (flavor) con diferencias sutiles pero importantes. JavaScript (ECMAScript), que es el motor de esta herramienta, soporta lookahead, lookbehind (desde ES2018), grupos con nombre ((?<nombre>...)), y flags como u para Unicode y d para índices de captura. Python usa el módulo re que añade modo verbose (re.VERBOSE) para escribir regex legibles con comentarios, y grupos con nombre con sintaxis propia ((?P<nombre>...)). POSIX, usado en herramientas de línea de comandos Unix como grep y sed, tiene dos variantes: Basic (BRE) donde los metacaracteres requieren escape, y Extended (ERE) con sintaxis más similar a la moderna. Cuando pruebes un patrón en esta herramienta, recuerda que estás usando el motor de JavaScript; si lo vas a usar en otro lenguaje, verifica que la sintaxis sea compatible.

Errores comunes y cómo evitarlos

El error más frecuente entre principiantes es confundir cuantificadores greedy (codiciosos) con lazy (perezosos). Por defecto, * y + son greedy: consumen la mayor cantidad de texto posible. Añadiendo ? después (*?, +?) los conviertes en lazy, consumiendo lo mínimo necesario. Otro problema grave es el backtracking catastrófico: patrones como (a+)+b aplicados a textos que no coinciden pueden hacer que el motor explore millones de combinaciones, bloqueando tu aplicación. La solución es evitar cuantificadores anidados y usar anclas para limitar el alcance de la búsqueda. También es común olvidar escapar caracteres especiales: el punto . coincide con cualquier carácter, así que para buscar un punto literal debes escribir \.. Lo mismo aplica para (, ), [, {, *, + y ?. Probar tus patrones en esta herramienta con textos de ejemplo variados te ayudará a detectar estos problemas antes de llevarlos a producción.

Preguntas frecuentes

Las expresiones regulares (regex o regexp) son patrones de texto que describen un conjunto de cadenas posibles. Se utilizan en programación, editores de texto y herramientas de línea de comandos para buscar, validar, extraer y manipular texto. Por ejemplo, el patrón \d{3}-\d{4} describe cualquier cadena con tres dígitos, un guión y cuatro dígitos, como un número de teléfono parcial.

g (global) busca todas las coincidencias en el texto, no solo la primera. i (case-insensitive) ignora la diferencia entre mayúsculas y minúsculas. m (multiline) hace que los anclas ^ y $ coincidan con el inicio y fin de cada línea, no solo del texto completo. s (dotAll) hace que el metacarácter punto (.) coincida también con caracteres de salto de línea, que normalmente excluye.

Sí. Las expresiones se ejecutan con el motor de RegExp nativo de JavaScript, que es el mismo que utilizan todos los navegadores modernos y Node.js. Esto significa que los resultados que obtienes aquí serán idénticos a los de tu código JavaScript en producción.

Un cuantificador greedy (codicioso) como * o + intenta coincidir con la mayor cantidad de texto posible. Un cuantificador lazy (perezoso) como *? o +? coincide con la menor cantidad posible. Por ejemplo, aplicado al texto '<b>uno</b><b>dos</b>', el patrón <b>.*</b> (greedy) coincide con todo el texto desde el primer <b> hasta el último </b>, mientras que <b>.*?</b> (lazy) coincide solo con '<b>uno</b>'.

El backtracking catastrófico ocurre cuando un patrón regex obliga al motor a explorar un número exponencial de combinaciones antes de determinar que no hay coincidencia. Sucede típicamente con cuantificadores anidados como (a+)+ o (a|aa)+. Puede congelar tu navegador o servidor durante segundos o incluso minutos. Para evitarlo, simplifica los cuantificadores anidados, usa cuantificadores posesivos cuando estén disponibles, y prueba siempre tus patrones contra textos largos que no coincidan.

Son muy similares pero no idénticas. JavaScript usa el estándar ECMAScript, que no soporta lookbehind de longitud variable (aunque las versiones modernas ya soportan lookbehind básico), ni el modificador x para modo verbose. Python añade funciones como grupos con nombre con sintaxis (?P<nombre>...), modo verbose con re.VERBOSE, y flags inline. PHP usa la librería PCRE que es más potente, con soporte para subrutinas, condicionales y backtracking controlado. Los patrones básicos (clases de caracteres, cuantificadores, anclas) son idénticos en todos los sabores.

Herramientas relacionadas

Lecturas relacionadas