Probar una regex en línea: guía práctica para depurar expresiones regulares

Probar una regex en línea: guía práctica para depurar expresiones regulares

Prueba una regex de JavaScript, revisa los grupos de captura y previsualiza un reemplazo $1 en el navegador, antes de pasarla a producción.

26.09.2026
13 min de lectura
Compartir este artículo:
Regex
Expresiones regulares
Validación
tools-dev
Tutorial

Un patrón que parece correcto merece una entrada que falle

Una expresión regular es un programa pequeño. Se escribe rápido, se pega desde un comentario y sale cara cuando acepta la cadena equivocada o congela la pestaña. El probador de regex ejecuta el motor RegExp de JavaScript del navegador sobre un patrón y un texto que pegas en local — resaltado a la izquierda, tarjetas de coincidencia con grupos a la derecha, y una vista previa de reemplazo opcional. No hay selector de dialecto: no es PCRE, no es Python, no es el motor de una base de datos. Es la misma familia que Node y que la palabra clave pattern de un JSON Schema evaluado por Ajv. La página está en el hub de utilidades para desarrolladores, junto a slugify y al conversor de mayúsculas, para los trabajos que no deberían ser una expresión escrita a mano.

Solo flags de JavaScript: g, i, m, s, u, y. Global (g) está activo por defecto y se puede apagar
El modo coincidencia resalta los aciertos y lista tarjetas con grupos numerados; un grupo con nombre aparece una vez como GROUP k (nombre)
El modo reemplazo previsualiza patrones de sustitución de JavaScript como $1, $& y $<name>
Seis ejemplos integrados y una chuleta que inserta el token en el cursor. «Cargar ejemplo» rellena el caso clave=valor y lo ejecuta
No se sube nada. Pulsa Probar para lanzar — cambiar el patrón, los flags, el modo o el texto borra el resultado anterior
Se devuelven como mucho 500 coincidencias. Una ráfaga de coincidencias vacías dispara un guarda. Los cuantificadores anidados pueden congelar la pestaña igualmente

Dónde ayuda el probador, y dónde debe tomar el relevo un test unitario

Buenos usos de la página

Un patrón que vas a pegar en código, una fixture, o la palabra clave pattern de un JSON Schema.

Reproducir un bug con el texto exacto del ticket, incluida la línea que no debe coincidir
Comparar voraz y perezoso sobre dos palabras entre comillas antes de elegir una clase negada
Comprobar que un pattern de JSON Schema es válido en JavaScript antes de compilar el esquema en Ajv
Previsualizar un reemplazo con $1 en una muestra corta y luego copiar el patrón a la revisión de código
Cargar una ficha de ejemplo cuando hace falta un punto de partida conocido en lugar de un campo vacío
Lo que no pertenece a un patio de regex

Algunos trabajos ya tienen una herramienta que codifica las reglas. Una expresión escrita a mano se desvía.

Slugs de URL: usa slugify (separador, mayúsculas, longitud) en lugar de un reemplazo que retocarás por idioma
camelCase, snake_case, kebab-case: el conversor de mayúsculas. Una regex de límites de palabra se rompe con dígitos y siglas
Email, UUID o date-time como regla de producto: un format de esquema o un parser dedicado, no la ficha Email (aprox.)
Un patrón que debe quedarse estable: commítelo junto a las fixtures en el repositorio. El probador no guarda tu patrón en el enlace de compartir — ese botón comparte la página de la herramienta, no la expresión en curso

Patrones que aguantan un vistazo y fallan con una entrada real

Depurar un fragmento PCRE en una caja JavaScript

El probador compila el campo con new RegExp. Una construcción recursiva como (?R) es inválida aquí y muestra el error del motor. Las barras alrededor del campo son el marco de la interfaz, no parte del patrón. Pegar /(\w+)/gi quita los delimitadores y fusiona esos flags con los que ya estaban activos — no los sustituye. Si g ya estaba activo, sigue activo. La segunda trampa es la barra invertida: el campo es la fuente de la regex, así que \d significa dígitos. Pegar \\d desde una cadena JSON o Java busca una barra invertida literal seguida de d.

Copiar un patrón exclusivo de PCRE desde una respuesta de un foro y esperar las mismas coincidencias
Escribir las barras que rodean el patrón, que entonces se vuelven caracteres literales
Creer que un pegado /patrón/flags sustituye los flags actuales en lugar de fusionarlos
Doblar cada barra invertida porque el patrón viene de un literal de cadena en el código fuente
Dejar que un cuantificador voraz se coma el resto de la línea

Sobre "one" and "two", el patrón ".+" con g devuelve una sola coincidencia: todo el tramo, de la primera comilla a la última. El motor toma todo lo que puede y luego devuelve caracteres hasta que encaja la última comilla. Pasar a ".+?" no significa «solo las palabras que querías». Con g hay dos coincidencias, "one" y "two". Perezoso significa el éxito más corto, no un filtro semántico. "[^"]*" es el patrón que no puede cruzar una comilla.

Usar .+ cuando el carácter de parada se conoce, y luego extrañarse de que una coincidencia se haya comido la línea
Tomar un cuantificador perezoso por un filtro de significado
Olvidar que g encuentra cada éxito, incluida la segunda palabra entre comillas
Probar solo la cadena cómoda que contiene un único par
Cuantificadores anidados sobre un texto largo

Una forma como (a+)+ frente a una larga serie de a que nunca llega al final esperado puede estallar en backtracking catastrófico. El probador no tiene un tiempo límite en el servidor. Corre en el hilo principal de la pestaña, así que la página puede congelarse. La herramienta sí limita lo que devuelve: la búsqueda global se detiene y muestra un aviso de truncado, o porque alcanzó el tope blando de 500 coincidencias, o porque un patrón de anchura cero disparó el guarda (el motor avanza un carácter tras una coincidencia vacía para que g no gire para siempre). Ese guarda no hace seguro un cuantificador anidado. La subida acepta .txt, .md y .log hasta 32 MiB en la cadena de prueba, siempre en local — un log entero más un patrón anidado es una buena forma de bloquear la pestaña.

Soltar un log de producción en el texto mientras el patrón todavía tiene cuantificadores anidados
Leer el aviso de truncado como «el patrón es correcto, solo había demasiados aciertos»
Probar \b en una cadena larga y tomar cientos de tarjetas vacías por coincidencias de contenido
Suponer que el navegador matará una expresión desbocada como lo haría un job de CI
Promover el ejemplo de email a validador

La ficha «Email (aprox.)» es [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,} sobre [email protected] x not-an-email [email protected]. Con g resalta [email protected] y [email protected]. Es una demo, no la RFC 5322, y la página lo dice. La misma honradez vale para el modo sticky: el flag y solo coincide aquí al inicio de la cadena de prueba, porque lastIndex se reinicia en cada ejecución. No «sigue donde terminó la coincidencia anterior» de un clic a otro. Y los resultados no se actualizan mientras escribes. Cambiar el patrón, los flags, el modo o el texto borra las tarjetas hasta que vuelves a pulsar Probar.

Publicar el patrón de email aproximado como validación de formulario
Esperar que el flag y continúe después de la coincidencia anterior
Editar el patrón y leer las tarjetas que acaban de desaparecer como un fallo del motor
Apagar g y extrañarse de que una cadena con tres fechas muestre una sola tarjeta

Qué cambia de verdad cada flag y cada modo aquí

g, i, m, s, u, y

Seis flags, ningún otro. El valor por defecto es solo g.

g — global. Cada coincidencia no solapada. Apagado: solo la primera. matchAll en JavaScript también exige g
i — ignorar mayúsculas. foo contra FOO falla hasta que i está activo
m — multilínea. ^ y $ coinciden en los bordes de línea. La ficha ^\w+: sobre «name: Ada» y luego «age: 36» necesita g y m para pillar ambas etiquetas
s — dotAll. El punto coincide con saltos de línea. Sin s, un patrón que debe cruzar un salto falla aunque el texto parezca continuo
u — Unicode. Convierte \p{L} en un escape de propiedad que coincide con letras. Sin u, la misma fuente coincide con el texto literal p{L}: compila, y no coincide con é
y — sticky, pero lastIndex se reinicia en cada ejecución, así que la coincidencia tiene que empezar en el índice 0 del texto. Sobre «ba», el patrón a con y no coincide; sobre «ab», coincide con la a inicial y se detiene
Tarjetas de coincidencia o una vista previa de reemplazo

Coincidencia lista los aciertos. Reemplazo muestra además la cadena sustituida, con los patrones de reemplazo de JavaScript.

Coincidencia: cada tarjeta muestra el índice, el texto y los grupos. Una coincidencia vacía (anchura cero) se etiqueta (vacío), no se omite
Los resaltados no se solapan: gana la primera coincidencia, los solapes posteriores se saltan en la cadena pintada
Reemplazo: $1 es el grupo 1, $& es la coincidencia entera, $<name> es un grupo con nombre. La ficha (\w+)=(\d+) con [$1=$2] sobre a=1 b=2 queda [a=1] [b=2]
El caso más corto de la documentación, (\d+) reemplazado por [$1] sobre x=10, queda x=[10]. La sustitución es una vista previa, no una reescritura de archivo
Grupos numerados, grupos con nombre y el tope de 500

Una captura con nombre es el mismo grupo que su número. La tarjeta lo muestra una vez.

La ficha de fecha (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) sobre «shipped 2024-03-15 ok» da GROUP 1 (year), GROUP 2 (month), GROUP 3 (day) — no una segunda fila sin nombre
La ficha de pares (\w+)=(\d+) sobre «user=42 role=admin env=prod» da una sola coincidencia, user=42. role=admin no son dígitos. El ejemplo funciona como está escrito, no es un bug
La ficha de dígitos \d+ sobre «order-1042 total=89» da 1042 y 89
Por encima de 500 coincidencias la lista se corta y un aviso dice que los resultados se truncaron (tope blando o guarda de bucle). El aviso invita a estrechar el patrón o el texto, no a tomar un barrido parcial por uno completo

Un caso, y luego una sola variable

Patrón, flags, texto, Probar

En el probador de regex no se ejecuta nada mientras escribes. Las tarjetas anteriores se borran en cuanto cambian las entradas.

1

Escribir la fuente, no un literal

Escribe \d+, no /\d+/g. Si pegas un literal /patrón/flags, el pegado o la pérdida de foco quita los delimitadores y fusiona los flags. Un patrón vacío es un error. Un patrón inválido muestra el mensaje de JavaScript.

2

Activa solo el flag que quieres probar

g está activo por defecto. Apágalo para confirmar que de verdad querías una sola coincidencia. Añade m antes de fiarte de ^ en una segunda línea. Añade u antes de \p{…}: sin él, \p{L} coincide con los caracteres literales p{L}, no con letras. Deja y apagado, salvo para comprobar una coincidencia que debe empezar en el índice 0.

3

Pulsa Probar y lee la tarjeta, no solo el resaltado

El resaltado muestra dónde está el acierto. La tarjeta muestra el índice y cada grupo. Pulsa una tarjeta para enfatizar ese acierto. En modo reemplazo, lee la cadena sustituida bajo las tarjetas antes de copiar el patrón al código.

Ejemplos, tokens y un archivo local

Las fichas son fixtures, no una biblioteca de validadores de producción.

Ejemplos: pares clave=valor, dígitos, fecha con nombre, email (aprox.), multilínea ^, reemplazar grupos. Elegir uno rellena los campos y ejecuta al momento
«Cargar ejemplo» hace lo mismo con la fixture de pares: (\w+)=(\d+) sobre user=42 role=admin env=prod
La chuleta inserta \d, \w, \s, ., [], ^, $, \b, +, *, ? y () en el cursor. Corchetes y paréntesis colocan el cursor dentro
La subida lee un archivo .txt, .md o .log de hasta 32 MiB en la cadena de prueba, en el navegador. Prefiere un extracto corto cuando el patrón no es claramente lineal
Borrar vacía el patrón, el texto, el reemplazo y el modo, y devuelve los flags a g

El mismo motor en Node

Recoger coincidencias como el probador

El RegExp de Node es el mismo lenguaje. matchAll exige el flag g. Sin g, llama a exec una vez.

Ejemplo básico

const subject = 'user=42 role=admin env=prod' const re = /(\w+)=(\d+)/g const matches = [...subject.matchAll(re)] // longitud 1 — role=admin no son dígitos // matches[0][0] === 'user=42' // matches[0][1] === 'user' // matches[0][2] === '42'
Previsualizar un reemplazo antes de que edite un archivo

Los patrones de reemplazo son los que acepta el campo de reemplazo. Es la ficha integrada, no un lenguaje de plantillas propio.

Ejemplo básico

const out = 'a=1 b=2'.replace(/(\w+)=(\d+)/g, '[$1=$2]') // [a=1] [b=2] const wrapped = 'x=10'.replace(/(\d+)/g, '[$1]') // x=[10]
regex-tester de FastMinify

Sin instalación, nada se sube, flags y grupos visibles, vista previa de reemplazo incluida. La contrapartida: sin selector de dialecto, modo sticky solo en el índice 0, como mucho 500 coincidencias devueltas, y un cuantificador anidado puede congelar la pestaña porque la ejecución es local. Quédate la página para una fixture y una revisión de código. Haz commit del patrón junto a los tests cuando proteja una entrada de producción. Si la expresión solo sustituía a un slug o a un cambio de mayúsculas, pasa a slugify o al conversor de mayúsculas en lugar de mantenerla.

Conclusión

Prueba el patrón contra una cadena que deba fallar, en el motor que lo va a ejecutar. Para JavaScript ese motor es RegExp, que es el que usa el probador de regex — incluido un pattern de JSON Schema que luego compilarás con Ajv en el validador de JSON Schema. No tomes la ficha Email (aprox.) por un validador, no esperes que el flag y retome a mitad de la cadena, y no des un log de 32 MiB a un cuantificador anidado. Cuando el trabajo es un slug o un cambio de mayúsculas, deja la expresión y usa la herramienta dedicada en el hub de utilidades para desarrolladores.

Solo RegExp de JavaScript — un fragmento PCRE que el probador rechace también fallará en Node
Pulsa Probar después de cada cambio; las tarjetas no siguen al cursor
Un .+ voraz entre comillas es una sola coincidencia; el perezoso es cada par más corto, no un filtro de significado
Los grupos con nombre aparecen una vez. Más de 500 aciertos es una lista truncada, no un barrido completo
El flag y solo coincide al inicio de la cadena de prueba en esta herramienta
Compartir este artículo
Compartir este artículo: