Testador de regex

Teste uma expressão regular ao vivo: correspondências e grupos de captura, pré-visualização de substituições e divisão de texto — com a semântica do JavaScript.

Flags
Texto de teste
Resultados

Introduza um padrão e um texto para ver resultados

O que esta ferramenta faz

Uma expressão regular é uma linguagem compacta para descrever padrões de texto, e a única forma fiável de escrever uma é vê-la a correr sobre texto real. Este testador faz exatamente isso, ao vivo, em três modos. Corresponder mostra cada lugar onde o padrão corresponde, realçado no texto, com cada grupo de captura listado por baixo. Substituir pré-visualiza o que String.replace produziria, incluindo as referências $1 e lt;name>. Dividir mostra como String.split cortaria o texto — incluindo as partes que quase ninguém prevê corretamente, como delimitadores capturados a aparecer no resultado.

O padrão corre no motor de JavaScript do seu próprio navegador, não numa imitação. O que corresponde aqui é exatamente o que corresponderá no seu código JavaScript, byte a byte, porque é o mesmo motor a fazer o trabalho.

Ler os resultados de correspondência

Cada correspondência é realçada no texto de teste e listada por baixo com a sua posição — os deslocamentos de caracteres onde começa e termina. Se o padrão contiver grupos de captura, cada grupo aparece sob a sua correspondência com o valor capturado. Os grupos são numerados pelo parêntese de abertura, da esquerda para a direita, exatamente como o motor os numera para $1, $2 e retrorreferências; um grupo nomeado mostra o nome ao lado do número. Um grupo que não participou na correspondência — por exemplo, o lado perdedor de uma alternância — é assinalado como tal em vez de aparecer como cadeia vazia, porque para o seu código são coisas diferentes: undefined versus "".

Um padrão pode legitimamente corresponder a zero caracteres — ^, \b ou uma alternativa vazia conseguem-no. Essas correspondências de comprimento zero não realçam nada, por isso a ferramenta marca a posição com um traço fino em vez de o deixar a perguntar-se para onde foi a correspondência.

As flags

As flags mudam o comportamento do padrão inteiro, e duas delas causam a maior parte da confusão com regex:

  • g (global) — encontra todas as correspondências, não só a primeira. Sem ela, corresponder mostra um resultado e substituir muda uma única ocorrência. É a flag mais esquecida.
  • i (ignorar maiúsculas/minúsculas) — as letras correspondem independentemente da caixa.
  • m (multilinha) — ^ e $ correspondem ao início e ao fim de cada linha, não só do texto inteiro.
  • s (dotAll) — o ponto também corresponde a quebras de linha. Sem ela, . para em cada quebra.
  • u (Unicode) — o padrão trabalha em pontos de código: emoji e outros caracteres fora do intervalo básico comportam-se corretamente, e os escapes de propriedades \p{…} ficam disponíveis.
  • y (ancorado) — a correspondência tem de começar exatamente onde a anterior terminou. Útil para tokenizadores; surpreendente em qualquer outro lado.
  • d (índices) — o motor regista as posições exatas de cada grupo. Não muda nada no que corresponde.

Referências de substituição

O texto de substituição não é tomado à letra — um punhado de sequências com $ é expandido para cada correspondência. $1 a $9 inserem o que os grupos numerados capturaram, lt;name> insere um grupo nomeado, amp; insere a correspondência inteira e $ produz um cifrão literal. Tudo o resto é copiado tal e qual.

"2026-07-20".replace(/(?<y>\d{4})-(\d{2})-(\d{2})/, "$3.$2.lt;y>")
// → "20.07.2026"

Um comportamento do JavaScript que vale a pena interiorizar: sem a flag g, o replace muda apenas a primeira ocorrência. Não é uma esquisitice desta ferramenta — é o que o seu código fará. A ferramenta mostra uma dica quando g está desligada, para que a substituição única não pareça um erro.

Como o split se comporta realmente

String.split com uma regex tem dois comportamentos que surpreendem regularmente até programadores experientes, e o modo dividir existe em grande parte para os tornar visíveis. Primeiro: se o padrão contiver grupos de captura, o que eles capturam é entrelaçado no array resultante entre os pedaços — dividir "a,b" com (,) produz três partes: a, a vírgula, b. Segundo: correspondências mesmo no início ou no fim do texto, ou duas correspondências adjacentes, produzem cadeias vazias no resultado, que a ferramenta mostra explicitamente em vez de esconder.

"a,b".split(/(,)/)   // → ["a", ",", "b"]
",a,".split(/,/)     // → ["", "a", ""]

Padrões desgovernados são parados, não suportados

Alguns padrões são armadilhas. Um quantificador aninhado como (a+)+ testado contra uma cadeia longa que quase corresponde obriga o motor a tentar um número exponencial de combinações antes de desistir — chama-se backtracking catastrófico, e pode congelar um separador do navegador durante minutos. Esta ferramenta executa o seu padrão numa thread worker separada e para-o ao fim de dois segundos: um padrão desgovernado custa-lhe uma mensagem em vez de uma página congelada. Se vir essa mensagem, procure no padrão quantificadores aninhados ou alternativas sobrepostas; a correção costuma ser garantir que a repetição interna e a externa não podem corresponder ao mesmo texto.

Como em todas as ferramentas deste site, o padrão e o texto nunca saem do seu dispositivo — o worker faz parte da página, não de um servidor.

Perguntas frequentes

Que variante de regex usa este testador?
JavaScript (ECMAScript), porque o padrão corre no motor do próprio navegador. Grupos nomeados, lookbehind e escapes de propriedades Unicode \p{…} funcionam como no JavaScript moderno. Padrões de PCRE ou Python transferem-se na maioria, mas construções que o JavaScript não tem — quantificadores possessivos, grupos atómicos, \A e \z — serão rejeitadas ou significarão outra coisa.
Porque é que o meu padrão só encontra uma correspondência?
Quase sempre: a flag g está desligada. Sem ela, o JavaScript para na primeira correspondência, e o replace muda apenas a primeira ocorrência. Marque a caixa g para procurar em todo o texto.
O que significa «não participou» para um grupo?
O grupo existe no padrão mas não foi usado nesta correspondência concreta — normalmente porque está no ramo perdedor de uma alternância, ou sob um quantificador que correspondeu zero vezes. No código o seu valor é undefined, que é diferente de capturar uma cadeia vazia, e a ferramenta mantém a distinção.
O meu padrão ou texto é enviado para um servidor?
Não. A correspondência corre inteiramente no seu navegador, numa thread worker da mesma página. O limite de segurança de dois segundos também é aplicado localmente — nada do que escreve sai do seu dispositivo.