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 ferramentaCaracteres 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ão | Corresponde a | Exemplo |
|---|---|---|
| . | Qualquer caractere menos quebra de linha | c.t encontra cat, cot, c7t |
| \d | Um dígito de 0 a 9 | \d\d encontra 42 em Sala 42 |
| \w | Letra, dígito ou sublinhado (só ASCII) | \w+ encontra user_01 |
| \s | Espaço, tabulação ou quebra de linha | a\sb encontra a b |
| \D \W \S | O contrário de \d, \w e \s | \D encontra o x em 4x4 |
| [abc] | Um entre a, b ou c | gr[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 |
| \b | Limite 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ão | Significado | Exemplo |
|---|---|---|
| * | 0 ou mais vezes | ab*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 vezes | a{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|b | a ou b | gato|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.