Probador de Regex
Prueba y depura expresiones regulares en tiempo real — con resaltado de coincidencias y grupos de captura.
Las expresiones regulares son el minilenguaje más denso en información de la programación —una docena de caracteres puede expresar un patrón que llevaría cincuenta líneas de código manual de cadenas— y también el menos indulgente, porque una regex casi correcta falla en silencio con las entradas que no se te ocurrió probar. Esa combinación es la razón por la que un probador en vivo es la forma correcta de trabajar: ves los resaltados aparecer y desaparecer mientras escribes, lo que convierte la escritura de regex de teoría cuidadosa en experimento rápido. Este probador ejecuta tu patrón contra tu texto de muestra en tiempo real, muestra los grupos de captura y admite las banderas estándar de JavaScript.
Cómo funciona el probador
Escribe un patrón en el campo de regex y pega texto de muestra debajo. Las coincidencias se resaltan al instante cuando cambia cualquiera de los dos, y los grupos de captura de cada coincidencia se listan con su contenido. Activa banderas para cambiar el comportamiento: g encuentra todas las coincidencias en vez de la primera, i ignora mayúsculas, m hace que ^ y $ funcionen por línea, y s permite que el punto coincida con saltos de línea. El motor es la propia implementación de regex de tu navegador, así que el comportamiento coincide exactamente con lo que hará el mismo patrón en código JavaScript.
La sintaxis esencial
. cualquier carácter \d dígito \w carácter de palabra
* 0 o más + 1 o más ? 0 o 1
[abc] conjunto [^abc] conjunto negado
^ inicio $ fin \b límite de palabra
(x) grupo de captura (?:x) sin captura
a|b alternancia {2,5} rango de repetición
Email (pragmático): [\w.+-]+@[\w-]+\.[\w.]+
Fecha (YYYY-MM-DD): ^\d{4}-\d{2}-\d{2}$La regla más consecuente de todas: los cuantificadores son voraces por defecto. .* toma la coincidencia más larga posible, así que `".*"` aplicado a una línea con dos cadenas entrecomilladas coincide desde la primera comilla hasta la última, tragándose todo lo de en medio. Añadir ? vuelve perezoso al cuantificador: `".*?"` se detiene en la primera comilla de cierre. Aproximadamente la mitad de los bugs de regex del mundo real son errores de voraz contra perezoso, y el arreglo es un solo carácter.
Lo que conviene saber sobre regex
- 1Prueba contra entradas que no deberían coincidir. Un patrón que coincide con todo lo que quieres está validado a medias; los patrones fallan por coincidir de más mucho más a menudo que de menos. Alimenta el probador con correos malformados, cadenas vacías y entradas casi válidas: el patrón que las rechaza correctamente es el que de verdad está terminado.
- 2Escapa los caracteres especiales literales. Los caracteres . * + ? ( ) [ ] { } | ^ $ \ tienen significado, y olvidar la barra invertida es el clásico bug silencioso: buscar la versión "1.2" con 1.2 también encuentra "132", porque el punto significa cualquier carácter. Para un punto literal, escribe \., siempre.
- 3Cuidado con el retroceso catastrófico. Cuantificadores anidados como (a+)+ contra una entrada que no coincide pueden forzar al motor a probar un número exponencial de caminos, congelando la pestaña: patrones así han tumbado servicios en producción. Si un patrón se cuelga con entrada larga, el problema es la estructura, no la entrada.
- 4La regex es la herramienta equivocada para estructuras anidadas. HTML, JSON y paréntesis balanceados requieren contar profundidad, algo que las expresiones regulares matemáticamente no pueden hacer. Extraer un atributo rápido de HTML conocido está bien; analizar HTML arbitrario con regex es un error famoso y genuino: usa un parser.
- 5Prefiere patrones legibles a patrones ingeniosos. Una regex se escribe una vez y se lee muchas, como todo código, pero es mucho más densa. Dividir un patrón heroico en dos pasos simples, o usar grupos sin captura (?:) para reducir ruido, compensa la primera vez que alguien —incluido tú— tenga que modificarla.
Preguntas frecuentes
¿Por qué mi patrón coincide demasiado?
Casi siempre por cuantificadores voraces. * y + agarran la coincidencia más larga que pueden, así que `".*"` sobre texto con varias secciones entrecomilladas coincide desde la primera comilla hasta la última de todas. Añade ? tras el cuantificador para volverlo perezoso —`".*?"`— y se detendrá en la finalización más temprana. Alternativamente, usa un conjunto negado como `"[^"]*"`, que suele ser más rápido y claro: coincide con todo excepto una comilla de cierre.
¿Qué hacen las banderas g, i, m y s?
g (global) encuentra todas las coincidencias en lugar de pararse en la primera; sin ella, las operaciones de reemplazo cambian solo una aparición. i (ignorar caso) hace que las letras coincidan en ambas cajas. m (multilínea) cambia ^ y $ de anclas del texto completo a anclas por línea. s (dotall) permite que . coincida con caracteres de salto de línea, cosa que por defecto no hace: relevante cuando un patrón debe abarcar varias líneas.
¿Cuál es la diferencia entre (x) y (?:x)?
Ambos agrupan, pero (x) captura —el texto coincidente se almacena y numera para extraerlo o referenciarlo— mientras que (?:x) agrupa sin capturar. Usa captura cuando necesites el contenido, y sin captura cuando solo necesites agrupar para alternancia o repetición. La no captura mantiene estables los números de grupo y es marginalmente más rápida; los grupos con nombre (?<nombre>x) son aún mejores cuando capturas varias cosas.
¿Existe una regex correcta para validar correos electrónicos?
No, y perseguirla es una trampa. La gramática RFC completa de las direcciones de correo es célebremente barroca: la regex técnicamente completa ocupa miles de caracteres y aun así no puede confirmar que el buzón exista. La respuesta pragmática: comprueba la forma con algo como [\w.+-]+@[\w-]+\.[\w.]+ y verifica la entregabilidad enviando de verdad un correo de confirmación. Comprobar la forma más confirmar supera a cualquier patrón heroico.
¿Funcionan los patrones igual en todos los lenguajes?
El núcleo es portable, pero los dialectos difieren en los bordes. Este probador usa el motor de JavaScript, así que el lookbehind, los grupos con nombre y las clases Unicode se comportan como en los navegadores modernos. Python difiere ligeramente (re.match ancla al inicio), grep usa una sintaxis más limitada salvo con -P, y Java exige doble escape de las barras invertidas dentro de literales de cadena. Prueba en el dialecto donde vayas a desplegar cuando uses características avanzadas.