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

Flags
  • 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 test e exec lembrarem 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.