Visualizando em Português Ver em inglês

Testador de regex

Teste expressões regulares JavaScript ao vivo. Veja as correspondências destacadas e os grupos de captura listados.

/ /

Correspondências destacadas

 

Correspondências e grupos

  1. Digite o padrão de regex no campo acima (sem precisar envolvê-lo em barras).
  2. Alterne os sinalizadores que quiser: g para todas as correspondências, i para ignorar maiúsculas, etc.
  3. Cole ou digite o texto de teste na caixa "String de teste".
  4. Veja as correspondências destacadas em tempo real; confira os grupos capturados na tabela abaixo.
O que ele faz?

Este testador roda seu padrão contra a string de teste usando o motor RegExp nativo do navegador — o mesmo que Node.js, Deno e qualquer navegador usam. As correspondências são destacadas em linha. Grupos de captura numerados e nomeados são extraídos para uma tabela, assim você vê exatamente o que cada trecho entre parênteses capturou.

Exemplo

Padrão (com sinalizador g):

\b(\w+)@(\w+\.\w+)\b

String de teste:

Contact us at [email protected] or [email protected]. Not an email: foo@bar (no TLD).

Correspondências:

1  [email protected]        $1: hello    $2: example.com
2  [email protected]   $1: support  $2: happycoder.dev

foo@bar não corresponde porque \w+\.\w+ exige um ponto no domínio.

Por que minha regex não está correspondendo?

  • Esqueceu do sinalizador g. Sem ele, só a primeira correspondência é retornada. /cat/.exec("cat cat") acha uma "cat"; /cat/g acha as duas.
  • Metacaracteres sem escape. example.com também corresponde a examplexcom porque . casa qualquer caractere. Escape: example\.com.
  • Correspondência gulosa pega demais. <.*> sobre <a><b> leva tudo. Use a forma preguiçosa <.*?> ou a classe negada <[^>]*> para parar no primeiro >.
  • Confusão de limite de palavra. \b é uma posição entre um caractere de palavra e um não-palavra. Padrões como \bfoo-bar\b falham porque o - no meio já é um limite não-palavra.
  • Diferença de caixa. [a-z]+ não vai casar com Hello. Acrescente o sinalizador i ou use [A-Za-z]+.
  • ^ / $ multilinha. Sem o sinalizador m eles ancoram apenas no início/fim da string toda, não de cada linha. Ative m se estiver varrendo linhas de log.
Perguntas frequentes

Qual sabor de regex este testador usa?

Regex de JavaScript (ECMAScript), via o motor RegExp embutido do navegador. Isso difere do PCRE (PHP, Perl), do módulo re do Python e do POSIX em vários pontos: sem recursão, sem quantificadores possessivos, grupos nomeados usam (?<nome>...) em vez de (?P<nome>...), e atalhos de classes como \d são só ASCII a menos que você adicione o sinalizador u.

Ele suporta lookbehind?

Sim. Asserções de lookbehind como (?<=foo)bar e (?<!foo)bar foram adicionadas no ES2018 e funcionam em todos os Chromium, Firefox e Safari atuais. Se você precisa atingir navegadores muito antigos em produção, confira o caniuse antes de depender delas — mas o próprio testador roda sem problemas.

O que significam os sinalizadores g, i, m, s e u?

g acha todas as correspondências em vez de apenas a primeira. i torna a correspondência insensível a maiúsculas. m faz ^ e $ casarem o início e o fim de cada linha em vez da string toda. s (dotall) faz o . casar quebras de linha também. u habilita o suporte completo a Unicode e um parsing mais estrito de escapes. Escolha só o que precisar — em especial o g muda bastante quantas correspondências você obtém.

Por que meu quantificador guloso está casando demais?

Quantificadores como *, + e {n,} são gulosos por padrão — casam o máximo possível e só recuam se o resto do padrão falhar. Adicione ? para deixá-los preguiçosos: .*? casa o mínimo possível. Correção comum para <a>.*</a> devorando várias tags: use <a>.*?</a> ou a classe negada <a>[^<]*</a>.

Como referencio um grupo capturado depois no padrão ou na substituição?

Dentro do padrão, use \1, \2, etc. para casar o mesmo texto que um grupo anterior capturou — (\w+)\s+\1 casa palavras repetidas. Numa string de substituição (não suportada neste testador ao vivo, mas em String.replace) use $1, $2. Grupos nomeados usam \k<nome> dentro do padrão e $<nome> em substituições.

Por que minha regex quebra quando o padrão contém um ponto, barra ou parêntese?

Esses são metacaracteres de regex. Para casá-los literalmente, escape com barra invertida: \. para um ponto, \/ para uma barra (opcional em uma string new RegExp, obrigatório entre literais /.../), \( e \) para parênteses. Os caracteres especiais são . * + ? ^ $ { } ( ) | [ ] \ — qualquer um como texto literal precisa de escape.

Vocês salvam a regex ou o texto de teste que eu digito aqui?

Não. Não guardamos os padrões que você escreve nem o texto em que os testa. Tudo é descartado assim que você fecha ou atualiza a aba — sem logs, sem registro do nosso lado do que você casou. Para mais tranquilidade, as ferramentas de desenvolvedor do seu navegador confirmam.