Probador de expresiones regulares
Escribe un patrón, observa cómo coincide con tu texto mientras escribes, y ve exactamente qué hace cada token. Grupos de captura, vista previa de reemplazo, y una comprobación de portabilidad para PCRE y Python.
Patrón
Tu expresión regular
Escribe solo el cuerpo del patrón — sin barras alrededor. Todo se actualiza mientras escribes.
Solo cambia la comprobación de portabilidad — la coincidencia siempre se ejecuta en el motor JavaScript de tu navegador.
Ajustes predefinidos
Texto de prueba
Texto contra el que comparar
Pega datos reales — una línea de log, una configuración, una exportación de chat. Nada sale de tu navegador.
794 caracteres · 14 líneas
Wespner ops log — node eu-fra-03 Ticket #4821 opened by [email protected], escalated to [email protected]. Billing contact: [email protected] (invoice WX-2026-0917). Panel: https://panel.wespner.eu/server/eu-fra-03/console Mirror: http://mirror.wespner.eu:8080/backups/latest.tar.zst Node IP 185.199.110.153, gateway 10.0.0.1, bad entry 999.1.1.1 in the allowlist. Server UUID 9f2c1a7e-3b44-4d8e-9c21-7a5f0b6e2d13 (instance 550e8400-e29b-41d4-a716-446655440000). Chat export: [12:04] Steve_84: this build is hell to maintain, honestly [12:05] Alex_MC: rotate the panel password and open a shell on the class-4 node [12:06] Steve_84: damn, the ass-end of that config is unreadable [12:07] Notch_Fan: <img src=x onerror=alert(1)> nice try [12:08] Alex_MC: harassment report filed, see /docs/rcon
Grupos de captura
Cada coincidencia, con sus grupos y posiciones
Los grupos numerados provienen de ( ) simples. Los grupos con nombre provienen de (?<name>…) y se listan por separado.
Introduce un patrón para ver las coincidencias y sus grupos de captura.
Modo explicación
Qué hace realmente cada pieza del patrón
Lee de arriba abajo — es el orden en que lo lee el motor. La sangría muestra el anidamiento dentro de los grupos.
(?<user>Named capturing group “user”, also group number 1. Refer to it as $<user> in a replacement, or \k<user> in the pattern.[\w.+-]Any single character that is a word character (letter, digit or underscore), “.”, “+” or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.@The character “@”, matched literally.(?<domain>Named capturing group “domain”, also group number 2. Refer to it as $<domain> in a replacement, or \k<domain> in the pattern.(?:Non-capturing group: groups tokens together for a quantifier or an alternation without storing what it matched, so it does not consume a group number.[\w-]Any single character that is a word character (letter, digit or underscore) or “-”.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.\.The character “.”, matched literally. The backslash strips any special meaning it would otherwise have.)Closes the group opened above.+Repeats the previous token one or more times. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.[a-z]Any single character that is anything from “a” to “z”.{2,}Repeats the previous token at least 2 times, with no upper limit. Greedy: it takes as much as it can, then hands characters back one at a time if the rest of the pattern fails.)Closes the group opened above.giFlags: g finds every match instead of stopping at the first; i ignores letter case.Reemplazar
Vista previa de buscar y reemplazar
Usa $1, $2 para grupos numerados, $<name> para los que tienen nombre, $& para toda la coincidencia y $$ para un signo de dólar literal.
Resultado
Introduce un patrón para previsualizar un reemplazo.
Nota honesta
Esta página no ejecuta PCRE ni Python
Aquí solo hay un motor de regex: el que viene integrado en tu navegador, que implementa el dialecto de JavaScript. Seleccionar PCRE o Python no cambia de motor, y no puede hacerlo — ni PCRE ni CPython se ejecutan en esta pestaña.
Lo que hace en realidad el ajuste de dialecto es comprobar tu patrón en busca de construcciones que se escriben de forma distinta, se comportan de forma distinta, o simplemente no existen en el dialecto que elegiste. Trata las coincidencias de arriba como resultados de JavaScript, y la lista de la derecha como "lo que te va a morder cuando pegues esto en PHP o Python".
Llamada equivalente
const re = /(?<user>[\w.+-]+)@(?<domain>(?:[\w-]+\.)+[a-z]{2,})/gi;
for (const m of text.matchAll(re)) console.log(m);A literal is fine when the pattern is fixed. Building one from a variable needs new RegExp(src, flags) — and the source escaped first.
Comprobación de portabilidad
Portabilidad a JavaScript
Heurístico — el patrón se escanea como texto, así que una construcción escrita dentro de una clase de caracteres todavía puede reportarse.
Chuleta
Ávido frente a perezoso
La razón más común por la que un patrón "coincide con demasiado".
<.*> contra <b>bold</b> coincide con toda la cadena, no con <b>. * y + son ávidos (greedy): cogen todo lo que pueden y solo devuelven caracteres cuando el resto del patrón falla.
Añade ? para hacer un cuantificador perezoso (lazy) — <.*?> se detiene en el primer >. Normalmente es aún mejor decir lo que realmente quieres decir, <[^>]*>, que no puede cruzar el delimitador en absoluto y no hace backtracking.
Chuleta
Anclajes y límites
^ y $ son el inicio y el final de la cadena — hasta que añades el flag m, momento en el que pasan a ser el inicio y el final de cada línea. Olvidar m en un archivo de configuración multilínea es la razón por la que un patrón por línea no coincide con nada en silencio.
\b es un límite de palabra de longitud cero, no un carácter. \bcat\b coincide con cat pero no con concatenate. Dentro de una clase de caracteres [\b] significa retroceso (backspace) en su lugar — una trampa genuina.
Un patrón que debe coincidir con toda la entrada necesita ambos anclajes. ^\d+ solo coincide sin problema con el inicio de 123abc.
Chuleta
Backtracking catastrófico
Los cuantificadores anidados donde las partes interna y externa pueden coincidir con el mismo texto — (a+)+$, (\w+\s?)*$, (\d+)*x — le dan al motor un número exponencial de formas de dividir la entrada. En una cadena que falla, cada carácter extra aproximadamente duplica el trabajo, así que 30 caracteres pueden tardar minutos.
La solución es eliminar la ambigüedad: (a+)+ se convierte en a+; (\w+\s?)* se convierte en \w+(?:\s\w+)*. Donde tu motor los admita, un grupo atómico (?>…) o un cuantificador posesivo a++ prohíbe el backtracking directamente — PCRE y Python 3.11+ tienen ambos, JavaScript no tiene ninguno.
Este probador ejecuta la coincidencia en un Web Worker con un límite de tiempo, así que un patrón descontrolado se aborta en lugar de bloquear la pestaña. Tu servidor de producción no tiene esa red de seguridad.
Chuleta
Filtros de palabras y el problema de Scunthorpe
Una lista de palabras sin límites coincide dentro de palabras inocentes. El caso canónico es el de la ciudad inglesa de Scunthorpe, cuyos residentes estuvieron años sin poder registrarse en algunos servicios por las cuatro letras que hay en medio de su nombre.
Más cerca de casa: hell coincide con shell, ass coincide con class y password, doc coincide con document. Envolver la alternancia en \b(?:…)\b arregla la mayoría de los casos. No arreglará la evasión deliberada (h e l l, h3ll), y perseguir eso con regex produce más falsos positivos de los que evita — por eso la moderación real combina una regex pequeña y conservadora con revisión humana.
Chuleta
Escapado, clases y el punto
Dentro de [ ] la mayoría de los metacaracteres pierden su poder: [.+*] son tres caracteres literales. Solo ^ (en primera posición), - (entre caracteres) y la barra invertida siguen siendo especiales, y ] debe escaparse.
El punto significa "cualquier carácter excepto un salto de línea" hasta que añades s. En un patrón de IP o de versión, un punto sin escapar coincide con cualquier cosa — 1.2.3.4 también coincide con 1x2y3z4.
Cuando construyes un patrón a partir de la entrada del usuario, escápalo primero. En JavaScript: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). En PHP preg_quote(), en Python re.escape().
Chuleta
Grupos que probablemente quieras que no capturen
Cada ( ) guarda su coincidencia y renumera todo lo que viene después. Si solo necesitas agrupar para una alternancia o un cuantificador, usa (?:…) — mantiene tu $1 estable cuando más tarde añades un grupo delante.
Los grupos con nombre (?<user>…) sobreviven completamente a la reordenación, y se leen mucho mejor en una cadena de reemplazo: $<user> en lugar de $3. Python los escribe como (?P<user>…).
¿Tienes tu propio servidor de juegos?
Servidores de juegos Wespner con protección DDoS, discos NVMe y activación en pocos minutos.