Pular para o conteúdo principal
Tooletto

Testador de expressões regulares

Teste expressões regulares de JavaScript contra texto de amostra com destaque ao vivo, grupos de captura, grupos nomeados e uma prévia de substituição. Funciona inteiramente no seu navegador.

  • Os arquivos nunca saem do seu dispositivo
  • Grátis, sem cadastro
  • Sem marcas d'água
  • Funciona offline depois de carregado
Loading tool…

Como testador de expressões regulares

  1. 1

    Insira seu padrão

    Digite a expressão e escolha as flags que precisar.

  2. 2

    Adicione texto de teste

    As correspondências são destacadas enquanto você digita, com cada grupo de captura listado.

  3. 3

    Teste uma substituição

    A aba de substituição pré-visualiza o resultado usando referências estilo $1.

Por que o destaque ao vivo supera ler um padrão na sua cabeça

Uma expressão regular é genuinamente difícil de rastrear mentalmente contra texto real — um padrão como `(\d{3})-(\d{2})-(\d{4})` é legível o bastante como descrição abstrata, mas confirmar que corresponde exatamente às substrings pretendidas, e apenas elas, contra um bloco específico de texto de amostra é um tipo de verificação diferente de ler o padrão e raciocinar sobre ele. Destacar cada correspondência diretamente no texto de amostra enquanto o padrão é escrito transforma esse raciocínio abstrato em uma confirmação visual concreta e imediata — as correspondências aparecem onde esperado ou não aparecem, sem necessidade de simulação mental.

Isso se torna especialmente valioso para qualquer coisa usando lookahead, lookbehind, ou quantificadores não gulosos, onde os limites reais de correspondência frequentemente não são o que alguém adivinharia apenas lendo o padrão. Ver exatamente onde uma correspondência começa e termina, em vez de assumir, detecta um erro de limite instantaneamente em vez de depois de já ter sido publicado dentro de uma função de validação.

O regex do JavaScript não é a mesma linguagem que PCRE ou o re do Python

A sintaxe de expressões regulares parece amplamente similar entre linguagens, mas os recursos específicos suportados diferem de formas que importam uma vez que um padrão usa algo além do básico. JavaScript carece de quantificadores possessivos e grupos atômicos, ambos existentes no PCRE (usado por PHP e muitas outras ferramentas) como formas de prevenir explicitamente certos padrões de retrocesso. Asserções lookbehind, agora suportadas no JavaScript, chegaram consideravelmente mais tarde que lookahead e não estavam disponíveis em versões mais antigas de navegadores, o que ainda importa ocasionalmente para código que precisa rodar em ambientes legados. E `\d` em um padrão JavaScript corresponde apenas a dígitos ASCII 0–9 a menos que o padrão também carregue a flag `u` (Unicode), o que surpreende qualquer um que assuma que se comporta igual a uma classe de dígitos ciente de Unicode no motor regex de outra linguagem. Testar um padrão destinado especificamente ao JavaScript, em vez de copiar um exemplo escrito para Python ou uma ferramenta de shell, é em torno do que esta ferramenta é construída.

Retrocesso catastrófico, e por que o testador tem um orçamento de tempo

Certos padrões regex — mais comumente aqueles com quantificadores aninhados, como `(a+)+b` — têm uma propriedade patológica onde, contra uma string longa que em última análise não corresponde, o motor explora um número exponencialmente crescente de formas de retroceder antes de desistir. Um padrão que retorna resultados instantaneamente contra uma string de dez caracteres que não corresponde pode levar mais tempo que a idade do universo contra uma de cinquenta caracteres, o que não é um exagero mas o comportamento matemático literal do crescimento exponencial. Esta é uma classe de vulnerabilidade real e explorável em sistemas de produção — um ReDoS, ou negação de serviço por expressão regular — onde um atacante que pode controlar a string de entrada para um padrão vulnerável pode travar indefinidamente um processo de servidor com uma única requisição.

Esta ferramenta aborta a avaliação depois de um orçamento de tempo curto especificamente para que um padrão com essa propriedade congele a sessão de teste em vez da aba do navegador inteira, e atingir esse aborto é em si informação útil: significa que o padrão provavelmente tem exatamente essa vulnerabilidade e precisa ser reestruturado, tipicamente tornando mais específico um quantificador interno para que a ambiguidade causando o retrocesso exponencial não possa surgir para começar.

Perguntas frequentes

Qual dialeto de regex é esse?

JavaScript (ECMAScript), que é o que roda no seu navegador. Difere de PCRE e Python em alguns pontos — sem lookbehind em navegadores muito antigos, sem quantificadores possessivos nem grupos atômicos, e `\d` corresponde apenas a dígitos ASCII a menos que você use a flag `u`.

O que a flag global realmente muda?

Sem `g`, apenas a primeira correspondência é encontrada. Com ela, todas as correspondências são retornadas — o que é o que você quer para destacar ou substituir em um documento inteiro. Esta ferramenta mostra todas as correspondências de qualquer forma, mas a flag ainda afeta como `replace` se comporta.

Por que meu padrão expirou o tempo?

Alguns padrões retrocedem catastroficamente — quantificadores aninhados como `(a+)+b` podem levar tempo exponencial em uma string que não corresponde. A ferramenta aborta depois de um orçamento de tempo curto em vez de congelar sua aba. Se isso acontecer, a correção quase sempre é tornar mais específico o quantificador interno.

Como uso grupos de captura em uma substituição?

Referencie-os como `$1`, `$2` e assim por diante, ou `$<nome>` para grupos nomeados escritos `(?<nome>…)`. Use `$&` para a correspondência inteira e `$$` para um cifrão literal.