Testador de regex
Teste expressões regulares JavaScript no seu próprio texto, com destaque das correspondências e prévia da substituição em tempo real — no seu navegador.
Esta página foi traduzida do inglês com a ajuda de IA e conferida com o original. Ler a versão em inglês
- Grátis — Sem necessidade de cadastro
- Instantâneo — Os resultados são atualizados enquanto você digita
- Privado — Processado no seu navegador
Uma expressão regular que funciona na sua cabeça e uma que funciona com dados reais costumam ser dois padrões diferentes. Este testador compila o seu padrão com o próprio motor RegExp do navegador, destaca cada correspondência no texto que você colar, lista os grupos de captura e pré-visualiza uma substituição, de modo que o ciclo de feedback custa uma tecla, e não um deploy.
Como funciona
Digite o padrão sem as barras em volta e marque as flags de que você precisa. O padrão é compilado com new RegExp(pattern, flags); um erro de sintaxe exibe na hora a mensagem do motor. Conforme você edita o texto de teste, as correspondências são encontradas com String.matchAll, destacadas no próprio texto e listadas com o índice inicial e os grupos de captura. Grupos nomeados, como (?<year>\d{4}), também são capturados.
A lista de correspondências sempre faz a busca global, mesmo com a flag g desmarcada, porque uma lista com uma correspondência só não é grande coisa. A busca para depois de 500 correspondências, e a lista abaixo do destaque mostra as 50 primeiras. A pré-visualização da substituição é diferente: ela chama String.replace com as suas flags exatamente como você escolheu, então sem g só a primeira ocorrência é substituída, o que reproduz o que o seu código vai fazer. A string de substituição aceita $1, $<name>, $& para a correspondência inteira e $$ para um cifrão literal.
Tudo roda no seu navegador; texto e padrões nunca são enviados para lugar nenhum.
As flags
- g aqui só afeta a pré-visualização da substituição, mas no código também faz
testeexeclembrarem a posição entre uma chamada e outra, uma causa frequente de resultados que alternam entre true e false. - i ignora maiúsculas e minúsculas. Com u, também trata corretamente maiúsculas e minúsculas em todo o Unicode.
- m faz
^e$casarem nos limites de cada linha, e não apenas nas extremidades da string inteira. - s permite que
.case com quebras de linha, o que ele normalmente não faz. - u ativa o modo Unicode: escapes
\u{1F600}, classes de propriedade\p{Letter}e tratamento correto de caracteres fora do plano multilíngue básico, que de outra forma são vistos como duas unidades. - y ancora cada correspondência na posição em que a anterior terminou.
JavaScript tem o seu próprio dialeto
Padrões copiados de grep, sed, Python ou Java quase sempre funcionam, mas nem sempre. JavaScript tem lookahead e lookbehind, quantificadores não gulosos, grupos nomeados e propriedades Unicode. Não tem quantificadores possessivos, grupos atômicos, âncoras \A e \Z nem classes POSIX como [[:digit:]], e não aceita o modificador (?i) aplicado ao padrão inteiro (a forma com escopo (?i:…) só funciona em motores recentes). Retrorreferências usam \1 no padrão e $1 na substituição, e não \1 nos dois, como no sed.
Correspondências de largura zero são válidas: a* casa com a string vazia em cada posição de bbb, e é por isso que um padrão mal ancorado pode informar mais correspondências do que há caracteres. O destaque as mostra como marcas finas para você ver onde elas caíram.
Backtracking catastrófico
Quantificadores aninhados sobre classes que se sobrepõem, por exemplo (\w+\s?)+$ aplicado a uma linha longa que não termina como esperado, fazem o motor testar um número exponencial de caminhos. Nesta ferramenta, o sintoma é uma aba travada; em produção, é uma negação de serviço disparada por uma única entrada maliciosa. Prefira classes de caracteres específicas a .*, evite quantificar um grupo que já contém um quantificador e ancore os padrões para que a falha seja detectada cedo.
Equivalente na linha de comando
O equivalente mais próximo da lista de correspondências é grep -oE, que imprime cada correspondência em uma linha; note que o grep usa a sintaxe POSIX estendida, e não a do JavaScript:
grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}' access.log | sort | uniq -c
Saiba mais
O guia de processamento de texto com grep, sed e awk aborda os dialetos POSIX e como a sintaxe deles difere da que você testa aqui. Do lado da linguagem, fundamentos de JavaScript explica os métodos de string que consomem esses padrões e como callbacks em replace dão mais controle do que uma string de substituição. Se a sua entrada for JSON em vez de texto livre, o formatador de JSON vai indentá-lo para que padrões baseados em linhas tenham onde se apoiar.
Perguntas frequentes
- Qual mecanismo de regex é usado aqui?
- O mecanismo RegExp nativo do JavaScript — o mesmo usado por String.match, String.replace e todos os navegadores e ambientes Node.js.
- Por que a lista de correspondências mostra mais resultados do que eu esperava?
- A lista de correspondências sempre busca de forma global para poder mostrar cada ocorrência, independentemente de você ter marcado a flag g. A flag g continua determinando se a prévia de substituição altera apenas uma correspondência ou todas, seguindo o comportamento real de .replace().
- Meu texto é enviado a algum lugar?
- Não. A busca de correspondências acontece totalmente no seu navegador.