Testador de Regex
Escreva um padrão, veja-o corresponder ao seu texto enquanto escreve, e veja exatamente o que cada token faz. Grupos de captura, pré-visualização de substituição, e verificação de portabilidade para PCRE e Python.
Padrão
A sua expressão regular
Escreva apenas o corpo do padrão — sem barras à volta. Tudo atualiza enquanto escreve.
Altera apenas a verificação de portabilidade — a correspondência corre sempre no motor JavaScript do seu navegador.
Predefinições
Texto de teste
Texto para corresponder
Cole dados reais — uma linha de log, uma configuração, uma exportação de chat. Nada sai do seu navegador.
794 carateres · 14 linhas
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 correspondência, com os seus grupos e posições
Os grupos numerados vêm de ( ) simples. Os grupos nomeados vêm de (?<nome>…) e são listados em separado.
Insira um padrão para ver as correspondências e os seus grupos de captura.
Modo de explicação
O que cada parte do padrão faz de facto
Leia de cima para baixo — é a ordem em que o motor o lê. A indentação mostra o aninhamento dentro de 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.Substituir
Pré-visualizar um localizar-e-substituir
Use $1, $2 para grupos numerados, $<nome> para nomeados, $& para a correspondência inteira e $$ para um sinal de dólar literal.
Resultado
Insira um padrão para pré-visualizar uma substituição.
Nota de transparência
Esta página não executa PCRE nem Python
Só há um motor de regex aqui: o que está integrado no seu navegador, que implementa a variante do JavaScript. Selecionar PCRE ou Python não muda de motor e não pode — nenhum PCRE ou CPython corre neste separador.
O que a definição de variante faz em vez disso é verificar o seu padrão à procura de construções escritas de forma diferente, que se comportam de forma diferente, ou que simplesmente não existem na variante que escolheu. Trate as correspondências acima como resultados de JavaScript, e a lista à direita como "o que o vai morder quando colar isto em PHP ou Python".
Chamada 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.
Verificação de portabilidade
Portabilidade para JavaScript
Heurístico — o padrão é analisado como texto, pelo que uma construção escrita dentro de uma classe de carateres ainda pode ser reportada.
Folha de referência
Ganancioso vs. preguiçoso
A razão mais comum de todas para um padrão "corresponder a demasiado".
<.*> contra <b>bold</b> corresponde à string inteira, não a <b>. * e + são gananciosos (greedy): agarram tudo o que conseguem e só devolvem carateres quando o resto do padrão falha.
Adicione ? para tornar um quantificador preguiçoso (lazy) — <.*?> para no primeiro >. Normalmente ainda melhor: diga o que realmente quer dizer, <[^>]*>, que não consegue atravessar o delimitador de todo e não faz backtracking.
Folha de referência
Âncoras e fronteiras
^ e $ são o início e o fim da string — até adicionar a flag m, altura em que passam a ser o início e o fim de cada linha. Esquecer o m num ficheiro de configuração com várias linhas é a razão pela qual um padrão por linha silenciosamente não corresponde a nada.
\b é uma fronteira de palavra de largura zero, não um carácter. \bcat\b corresponde a cat mas não a concatenate. Dentro de uma classe de carateres [\b] significa backspace em vez disso — uma armadilha genuína.
Um padrão que tem de corresponder à entrada inteira precisa de ambas as âncoras. ^\d+ sozinho corresponde alegremente ao início de 123abc.
Folha de referência
Backtracking catastrófico
Quantificadores aninhados onde a parte interior e exterior podem corresponder ao mesmo texto — (a+)+$, (\w+\s?)*$, (\d+)*x — dão ao motor exponencialmente muitas formas de dividir a entrada. Numa string que falha, cada carácter extra praticamente duplica o trabalho, pelo que 30 carateres podem demorar minutos.
A correção é remover a ambiguidade: (a+)+ passa a a+; (\w+\s?)* passa a \w+(?:\s\w+)*. Onde o seu motor os suporta, um grupo atómico (?>…) ou um quantificador possessivo a++ proíbe o backtracking por completo — o PCRE e o Python 3.11+ têm ambos, o JavaScript não tem nenhum.
Este testador executa a correspondência num Web Worker com um limite de tempo, para que um padrão descontrolado seja interrompido em vez de congelar o separador. O seu servidor de produção não tem essa rede de segurança.
Folha de referência
Filtros de palavras e o problema de Scunthorpe
Uma lista de palavras sem fronteiras corresponde dentro de palavras inocentes. O caso canónico é a cidade inglesa de Scunthorpe, cujos residentes ficaram bloqueados de se registarem em serviços durante anos por causa das quatro letras no meio do seu nome.
Mais perto de casa: hell corresponde a shell, ass corresponde a class e password, doc corresponde a document. Envolver a alternação em \b(?:…)\b resolve a maior parte disto. Não vai resolver a evasão deliberada (h e l l, h3ll), e perseguir isso com regex produz mais falsos positivos do que os que evita — por isso a moderação real combina um regex pequeno e conservador com revisão humana.
Folha de referência
Escaping, classes e o ponto
Dentro de [ ] a maioria dos metacaracteres perde o seu poder: [.+*] são três carateres literais. Só ^ (na primeira posição), - (entre carateres) e a barra invertida continuam especiais, e ] tem de ser escapado.
O ponto significa "qualquer carácter exceto uma quebra de linha" até adicionar s. Num padrão de IP ou versão, um ponto não escapado corresponde a qualquer coisa — 1.2.3.4 também corresponde a 1x2y3z4.
Quando constrói um padrão a partir de entrada do utilizador, escape-o primeiro. Em JavaScript: s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"). Em PHP preg_quote(), em Python re.escape().
Folha de referência
Grupos que provavelmente quer que não capturem
Cada ( ) guarda a sua correspondência e renumera tudo o que vem depois dela. Se só precisa de agrupar para uma alternação ou um quantificador, use (?:…) — mantém o seu $1 estável quando mais tarde adicionar um grupo à frente dele.
Os grupos nomeados (?<user>…) sobrevivem inteiramente a reordenações, e leem-se muito melhor numa string de substituição: $<user> em vez de $3. O Python escreve-os como (?P<user>…).
Gere o seu próprio servidor de jogos?
Servidores de jogos Wespner com proteção DDoS, discos NVMe e ativação em poucos minutos.