Guia rápido de regex para iniciantes

Uma expressão regular é um padrão de busca: \d{4} encontra quatro dígitos seguidos, ^ e $ prendem a correspondência ao início e ao fim, e os parênteses capturam partes que você quer reaproveitar. Este guia reúne a sintaxe que você vai usar com mais frequência, com padrões para e-mail, telefone e datas que foram testados em textos reais. Experimente cada exemplo no testador de regex desta página enquanto lê.

7 min de leitura

O básico em um minuto

A maioria dos caracteres corresponde a si mesma: casa encontra as letras c, a, s, a nessa ordem, em qualquer lugar do texto, inclusive dentro de casamento. Alguns caracteres têm significado especial: . ^ $ * + ? ( ) [ ] { } | e a barra invertida. Para encontrar um deles literalmente, coloque uma barra invertida na frente: \. encontra um ponto de verdade e \$ um cifrão.

Os exemplos aqui usam a sintaxe do JavaScript, que é a que os navegadores, o Node.js e o testador desta página executam. Python, PHP (PCRE), Java e .NET compartilham quase tudo; as diferenças ficam principalmente no lookbehind, na sintaxe de grupos nomeados e em alguns escapes. Digite um padrão em Expressão regular sem as barras em volta, cole um texto em Texto de teste, e cada correspondência é destacada.

Experimente aqui: Testador de regex

Abrir a página completa da ferramenta

Caracteres e classes

Uma classe de caracteres corresponde a um único caractere de um conjunto. [aeiou] encontra uma vogal, [a-z] uma letra minúscula ASCII, [^0-9] qualquer coisa que não seja dígito. Dentro dos colchetes a maioria dos caracteres especiais perde o significado, então [.?] encontra um ponto ou um ponto de interrogação. Coloque o hífen no começo ou no fim se quiser um hífen literal: [-.] ou [.-].

PadrãoCorresponde aExemplo
.Qualquer caractere menos quebra de linhac.t encontra cat, cot, c7t
\dUm dígito de 0 a 9\d\d encontra 42 em Sala 42
\wLetra, dígito ou sublinhado (só ASCII)\w+ encontra user_01
\sEspaço, tabulação ou quebra de linhaa\sb encontra a b
\D \W \SO contrário de \d, \w e \s\D encontra o x em 4x4
[abc]Um entre a, b ou cgr[ae]y encontra gray e grey
[^abc]Qualquer caractere menos a, b ou c[^,]+ encontra o texto entre vírgulas
\p{L}Qualquer letra de qualquer idioma (flag u)\p{L}+ encontra ação e Straße
\bLimite de palavra (não é caractere)\bcasa\b encontra casa mas não casamento

Quantificadores, âncoras e grupos

Os quantificadores dizem quantas vezes o que vem antes deles se repete. As âncoras correspondem a uma posição, não a um caractere. Os grupos juntam partes do padrão, capturam o que encontraram e permitem escolher entre alternativas.

PadrãoSignificadoExemplo
*0 ou mais vezesab*c encontra ac, abc, abbc
+1 ou mais vezes\d+ encontra 7 e 2026
?0 ou 1 vez (opcional)colou?r encontra color e colour
{3}Exatamente 3 vezes\d{3} encontra 555
{2,4}Entre 2 e 4 vezes\d{2,4} encontra 12, 123, 1234
{2,}2 ou mais vezesa{2,} encontra aa e aaaa
*? +? ??Preguiçoso: o mínimo possível<.+?> encontra <b> e </b> separadamente
^Início do texto (ou da linha com a flag m)^Erro encontra Erro só no começo
$Fim do texto (ou da linha com a flag m)\.pdf$ encontra nomes que terminam em .pdf
(abc)Grupo de captura, reutilizado como $1(\d{4})-(\d{2}) captura ano e mês
(?:abc)Grupo sem captura(?:ab)+ encontra ababab
(?<ano>\d{4})Grupo nomeado, reutilizado como $<ano>Aparece como ano na tabela de grupos
a|ba ou bgato|cachorro encontra qualquer uma das palavras
(?=x) (?!x)Seguido de x, não seguido de x\d+(?=px) encontra 16 em 16px
(?<=x) (?<!x)Precedido de x, não precedido de x(?<=\$)\d+ encontra 25 em $25

Flags

As flags mudam o comportamento do padrão inteiro. No testador elas são caixas de seleção ao lado do padrão; no código JavaScript elas vêm depois da barra final, como em /gato/gi.

  • g (global): encontra todas as correspondências em vez de parar na primeira. Necessária para substituir tudo.
  • i (ignorar maiúsculas e minúsculas): Gato, GATO e gato correspondem a gato.
  • m (multilinha): ^ e $ correspondem ao início e ao fim de cada linha, não só do texto inteiro. Use em logs e listas.
  • s (dotAll): o ponto também pega quebras de linha, então .* pode atravessar várias linhas.
  • u (Unicode): ativa \p{L} e outros escapes de propriedade, trata emoji e outros caracteres fora do plano básico como um só caractere e rejeita escapes desconhecidos.
  • y (sticky): a correspondência precisa começar exatamente onde a anterior terminou. Usada principalmente para escrever tokenizadores.

Padrões testados para e-mail, telefone e datas

Estes padrões foram conferidos com exemplos válidos e inválidos. Coloque ^ no início e $ no fim quando for validar um campo inteiro, e deixe de fora quando for procurar dentro de um texto maior.

E-mail: [\w.+-]+@[\w-]+(\.[\w-]+)+ encontra ana.souza+news@mail.example.com.br e a@b.co, e rejeita me@localhost porque exige um ponto no domínio. É o padrão E-mail em Padrões comuns no testador. Nenhuma regex consegue confirmar se um endereço existe de verdade; para isso, mande um e-mail de confirmação. A gramática oficial de endereços (RFC 5322) permite formas que um padrão prático deveria rejeitar de qualquer jeito.

Telefone no formato internacional E.164: \+[1-9]\d{6,14} encontra +5511912345678 e +14155552671, o formato usado por APIs de SMS e de chamadas (um mais, o código do país e no máximo 15 dígitos no total). Para números brasileiros escritos por pessoas, \(?\d{2}\)?[\s-]?9?\d{4}-?\d{4} encontra (11) 91234-5678, 11 91234-5678, 11912345678 e o fixo (21) 3234-5678. Ele também aceita um parêntese sem par, como (11 91234-5678, então normalize os números tirando tudo o que não for dígito antes de guardar. Para números dos Estados Unidos, \(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4} encontra (555) 123-4567, 555.123.4567 e 5551234567. Para achar números internacionais misturados no texto, como +44 20 7946 0958 ou +55 (11) 91234-5678, use o padrão Telefone em Padrões comuns no testador.

Data no formato ISO AAAA-MM-DD: \d{4}-\d{2}-\d{2} encontra qualquer coisa com cara de data. Uma versão mais rígida, (19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]), rejeita o mês 13 e o dia 00, mas ainda aceita 2026-02-31. A regex confere o formato; para saber se o dia existe, use as funções de data da sua linguagem. Para o formato brasileiro DD/MM/AAAA, \d{2}/\d{2}/\d{4} encontra 26/10/2026.

Mude o formato de datas com a substituição: procure (\d{4})-(\d{2})-(\d{2}), marque Substituir por, digite $3/$2/$1 no campo ao lado e 2026-10-26 vira 26/10/2026.

Erros comuns e como corrigir

  • Esquecer de escapar o ponto: example.com também encontra exampleXcom. Escreva example\.com.
  • Correspondência gulosa: <.+> em <b>negrito</b> pega a string inteira. Use o preguiçoso <.+?> ou uma classe negada <[^>]+>.
  • Faltar âncoras na validação: \d{5} aceita abc12345xyz porque encontra cinco dígitos lá dentro. Use ^\d{5}$.
  • Esperar que \w pegue letras acentuadas: sem a flag u ele cobre só A-Z, a-z, 0-9 e _, então João vira Jo e o. Use \p{L} com a flag u para nomes em qualquer idioma.
  • Esquecer a flag g: a substituição troca só a primeira correspondência, e o testador mostra só uma.
  • Quantificadores aninhados como (a+)+ ou (\w+\s?)+$: em algumas entradas eles levam tempo exponencial, o chamado catastrophic backtracking. O testador interrompe o padrão depois de 1,5 segundo e avisa; reescreva de um jeito que cada parte só possa corresponder de uma forma.
  • Analisar HTML ou JSON com regex: serve para uma busca rápida, mas não é confiável para análise de verdade. Use um parser para qualquer coisa aninhada.

Como montar um padrão passo a passo

Comece com um trecho literal do texto que você quer, por exemplo 2026-10-26, e confirme que ele corresponde. Depois troque as partes por classes, uma de cada vez: \d{4}-10-26, depois \d{4}-\d{2}-\d{2}. Depois de cada mudança, veja o que mais ficou destacado no texto de teste e acrescente algumas linhas que não deveriam corresponder. Um bom texto de teste tem tanto os casos que você quer quanto os quase acertos.

Abra a tabela Correspondências para ver a posição e cada grupo de captura de cada correspondência. Se um grupo mostrar a parte errada, mude os parênteses de lugar. Quando o padrão funcionar, copie para o seu código do jeito que está: o JavaScript e o testador usam o mesmo motor, então o resultado será idêntico.

Passo a passo

  1. Digite o padrãoEscreva a expressão em Expressão regular, sem barras, ou escolha uma em Padrões comuns.
  2. Escolha as flagsMarque g para todas as correspondências, i para ignorar maiúsculas, m para âncoras linha a linha e u para letras de qualquer idioma.
  3. Cole o texto de testeInclua exemplos que devem e que não devem corresponder. As correspondências são destacadas enquanto você digita.
  4. Confira os gruposVeja na tabela Correspondências as posições e os grupos de captura.
  5. Veja a substituição antesMarque Substituir por e digite $1, $<nome> ou $& para ver o resultado antes de usar no código.

Perguntas frequentes

O que significa .* em regex?

Qualquer caractere, zero ou mais vezes, o máximo possível. Ele é guloso, então .* vai até o fim da linha; use .*? para parar no primeiro ponto possível.

Qual a diferença entre + e *?

O + exige pelo menos uma repetição, o * aceita também zero. \d+ exige um dígito, \d* corresponde até a uma string vazia.

Como encontro um ponto, colchete ou ponto de interrogação literal?

Coloque uma barra invertida na frente: \. \[ \? . Dentro de colchetes o ponto e o ponto de interrogação já são literais, então [.?] também funciona.

Por que minha regex funciona em uma linguagem e não em outra?

Os sabores variam nos detalhes: suporte a lookbehind, sintaxe de grupo nomeado ((?<nome>) contra (?P<nome>) no Python), \w e tratamento de Unicode. A base, como classes, quantificadores e âncoras, é igual em todo lugar.

O texto que eu testo é enviado para algum lugar?

Não. O testador roda em um worker em segundo plano no seu navegador, então seus logs e dados ficam no seu dispositivo. Ele também funciona offline depois que a página carrega.

Uma regex consegue validar um e-mail por completo?

Não. Ela rejeita erros de digitação óbvios, mas só o envio de um e-mail prova que o endereço existe. Mantenha o padrão simples e confirme por e-mail.