Como usar expressoes regulares (regex): guia completa para desenvolvedores
Aprenda expressoes regulares do zero. Sintaxe basica, classes de caracteres, quantificadores, grupos, lookahead, lookbehind e padroes comuns para email, telefone, URL e IP, com exemplos praticos.
O que sao expressoes regulares e para que servem
As expressoes regulares (regex ou regexp) sao padroes de busca usados para encontrar, validar e manipular texto com muita precisao. Elas sao uma ferramenta central em programacao, automacao, administracao de sistemas e tratamento de dados.
Uma regex e, na pratica, uma sequencia de caracteres que descreve um padrao. Em vez de escrever varias condicionais, voce pode resolver validacoes e buscas complexas com uma unica expressao bem montada.
Usos comuns de regex:
- Validacao de dados: email, telefone, URL, CEP e outros formatos
- Busca e substituicao: localizar padroes em textos grandes e trocar trechos rapidamente
- Extracao de dados: capturar informacoes em logs, scraping e textos nao estruturados
- Analise de logs: identificar erros, IPs, codigos e rotas
- Linting e formatacao: checar convencoes em codigo e conteudo
- Rotas em frameworks: definir padroes de URL em ferramentas web
Regex esta presente em praticamente todas as linguagens de programacao, como JavaScript, Python, Java, C#, PHP, Ruby, Go e Rust. Tambem aparece em ferramentas de terminal como grep, sed e awk.
Se quiser praticar enquanto le, abra nossa ferramenta de teste regex em outra aba.
Sintaxe basica: caracteres literais e metacaracteres
A sintaxe de regex combina caracteres literais, que sao buscados exatamente como aparecem, e metacaracteres, que possuem significado especial.
Caracteres literais:
Letras, numeros e muitos simbolos sao tratados literalmente. O padrao gato encontra a palavra "gato" no texto.
Metacaracteres fundamentais:
| Metacaractere | Significado | Exemplo | Corresponde a |
|---|---|---|---|
. | Qualquer caractere (exceto quebra de linha) | g.to | "gato", "gito", "g3to" |
^ | Inicio da linha/cadeia | ^Ola | "Ola mundo" (so no inicio) |
$ | Fim da linha/cadeia | mundo$ | "Ola mundo" (so no fim) |
* | 0 ou mais repeticoes | ab*c | "ac", "abc", "abbc", "abbbc" |
+ | 1 ou mais repeticoes | ab+c | "abc", "abbc" (nao "ac") |
? | 0 ou 1 repeticao (opcional) | colou?r | "color", "colour" |
| | Alternativa (OU) | gato|cachorro | "gato" ou "cachorro" |
\ | Escape do proximo caractere | \. | Um ponto literal |
Escapar metacaracteres:
Quando voce precisa procurar um metacaractere como texto literal, deve escapá-lo com \.
\.procura um ponto literal\*procura um asterisco literal\?procura um sinal de interrogacao literal\(e\)procuram parenteses literais\\procura uma barra invertida literal
Exemplo pratico: para localizar a string "preco: $9.99", voce precisa de preco: \$9\.99.
Classes de caracteres e classes predefinidas
As classes de caracteres permitem definir conjuntos de caracteres validos em uma posicao especifica do padrao.
Classes personalizadas com colchetes [ ]:
| Padrao | Significado | Exemplo de correspondencia |
|---|---|---|
[abc] | Qualquer um entre a, b ou c | "a", "b", "c" |
[a-z] | Qualquer letra minuscula | "a", "m", "z" |
[A-Z] | Qualquer letra maiuscula | "A", "M", "Z" |
[0-9] | Qualquer digito | "0", "5", "9" |
[a-zA-Z] | Qualquer letra | "a", "Z", "m" |
[a-zA-Z0-9] | Qualquer alfanumerico | "a", "3", "Z" |
[^abc] | Qualquer um EXCETO a, b ou c | "d", "1", "Z" |
[^0-9] | Qualquer um que NAO seja digito | "a", "!", " " |
Classes predefinidas:
| Atalho | Equivalente | Significado |
|---|---|---|
\d | [0-9] | Qualquer digito |
\D | [^0-9] | Qualquer nao digito |
\w | [a-zA-Z0-9_] | Caractere de palavra |
\W | [^a-zA-Z0-9_] | Caractere que nao e de palavra |
\s | [\t\n\r\f\v ] | Espaco em branco |
\S | [^\t\n\r\f\v ] | Qualquer nao espaco |
\b | (sem equivalente direto) | Limite de palavra |
Limite de palavra (\b): \bgato\b encontra a palavra completa "gato", mas nao "gatinho" nem "meugato".
Exemplo pratico: para validar uma string com apenas letras, numeros e hifens, use ^[a-zA-Z0-9-]+$.
Quantificadores e modificadores de repeticao
Os quantificadores indicam quantas vezes o elemento anterior deve aparecer.
Quantificadores basicos:
| Quantificador | Significado | Exemplo | Corresponde a |
|---|---|---|---|
* | 0 ou mais vezes | \d* | "", "5", "123", "99999" |
+ | 1 ou mais vezes | \d+ | "5", "123", "99999" |
? | 0 ou 1 vez | -?\d+ | "42", "-42" |
{n} | Exatamente n vezes | \d{4} | "2026", "1234" |
{n,} | n ou mais vezes | \d{2,} | "12", "123", "1234" |
{n,m} | Entre n e m vezes | \d{2,4} | "12", "123", "1234" |
Greedy vs lazy: por padrao, os quantificadores sao greedy e tentam consumir o maximo possivel. Ao adicionar ?, eles se tornam lazy e consomem o minimo necessario.
Exemplo: no texto <b>Ola</b> e <b>Mundo</b>, <b>.*</b> pega tudo de uma vez, enquanto <b>.*?</b> encontra cada bloco separadamente.
Essa diferenca e essencial em HTML, XML e qualquer texto com delimitadores repetidos.
Exemplo pratico: ^\d{5}(-\d{4})?$ valida um ZIP code dos EUA com extensao opcional.
Grupos de captura e referencias
Os grupos servem para agrupar subexpressoes, capturar resultados e reaproveitar partes do padrao.
Tipos de grupos:
| Sintaxe | Tipo | Descricao |
|---|---|---|
(padrao) | Grupo de captura | Agrupa e captura o texto |
(?:padrao) | Grupo sem captura | Agrupa sem armazenar |
(?<nome>padrao) | Grupo nomeado | Captura com nome identificavel |
\1, \2 | Backreference | Referencia ao texto capturado anteriormente |
Exemplo basico: (\d{4})-(\d{2})-(\d{2}) separa ano, mes e dia em uma data no formato YYYY-MM-DD.
- Grupo 1: ano
- Grupo 2: mes
- Grupo 3: dia
Grupos nomeados: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) melhora a legibilidade no codigo.
Backreferences: (\w+)\s+\1 encontra palavras duplicadas; (['"])(.*?)\1 garante que as aspas de abertura e fechamento sejam iguais.
Alternancia: (https?|ftp):// corresponde a "http://", "https://" ou "ftp://". Teste esses padroes na nossa ferramenta regex.
Lookahead e lookbehind: assercoes de posicao
Lookahead e lookbehind verificam se um padrao existe antes ou depois da posicao atual sem consumir caracteres. Sao ideais para validacoes mais sofisticadas.
Os 4 tipos principais:
| Sintaxe | Nome | Significado |
|---|---|---|
(?=padrao) | Positive lookahead | O que vem depois DEVE corresponder |
(?!padrao) | Negative lookahead | O que vem depois NAO deve corresponder |
(?<=padrao) | Positive lookbehind | O que vem antes DEVE corresponder |
(?<!padrao) | Negative lookbehind | O que vem antes NAO deve corresponder |
Exemplo 1: senha forte
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$
- Exige ao menos uma maiuscula
- Ao menos uma minuscula
- Ao menos um digito
- Minimo de 8 caracteres
Exemplo 2: (?<=\$)\d+\.\d{2} captura valores monetarios sem o simbolo.
Exemplo 3: \w+(?!\s*:) encontra palavras nao seguidas por dois-pontos.
Exemplo 4: (?<!-)\b\d+\b encontra apenas numeros positivos. Em alguns sabores de regex, lookbehind possui restricoes de compatibilidade.
Padroes comuns: email, telefone, URL e IP
Abaixo estao alguns dos padroes de regex mais usados no dia a dia. Mesmo assim, lembre-se de que formatos complexos, como email, merecem validacao adicional no servidor.
1. Email:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
2. Telefone internacional (E.164):
^\+?[1-9]\d{1,14}$
3. URL (HTTP/HTTPS):
^https?:\/\/[\w.-]+(?:\.[a-zA-Z]{2,})(?:\/[\w.~:/?#\[\]@!$&'()*+,;=-]*)?$
4. IPv4:
^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$
5. Data ISO: ^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$
6. Cor hexadecimal CSS: ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
Teste e ajuste todos esses padroes na nossa ferramenta de teste regex. Para validar JSON que contenha esses campos, use tambem o nosso validador JSON.
Flags, desempenho e boas praticas
Para dominar regex, voce precisa conhecer os flags e seguir boas praticas de desempenho e manutencao.
Flags comuns:
| Flag | Nome | Efeito |
|---|---|---|
g | Global | Encontra todas as correspondencias |
i | Case insensitive | Ignora diferencas entre maiusculas e minusculas |
m | Multiline | ^ e $ funcionam por linha |
s | Dotall | O ponto tambem pega quebras de linha |
u | Unicode | Suporte completo a Unicode |
Em JavaScript: /padrao/flags. Em Python: re.compile(r'padrao', re.IGNORECASE | re.MULTILINE).
Boas praticas de desempenho:
- Evite backtracking catastrofico: padroes ambiguos como
(a+)+$podem causar explosao de tentativas - Seja especifico:
[a-z]+costuma ser melhor que.+ - Use ancoras:
^e$reduzem buscas desnecessarias - Prefira grupos sem captura:
(?:...)quando voce nao precisa salvar a correspondencia - Compile a regex: se o padrao for reutilizado varias vezes
Boas praticas de manutencao:
- Comente regex complexas
- Divida padroes longos em partes menores
- Escreva testes positivos e negativos
- Nao use regex para tudo: HTML, XML e JSON merecem parsers proprios
Pratique e refine seus padroes com a nossa ferramenta regex, que mostra correspondencias em tempo real.
Experimente esta ferramenta:
Abrir ferramenta→Perguntas frequentes
Qual e a diferenca entre * + e ? em regex?
O asterisco (*) significa 0 ou mais repeticoes do elemento anterior. O sinal de mais (+) significa 1 ou mais repeticoes. O ponto de interrogacao (?) significa 0 ou 1 repeticao, ou seja, torna o elemento opcional.
Como validar um email com expressao regular?
Um padrao pratico e ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$. Ele cobre a estrutura mais comum de email, mas em producao convem complementar com verificacao no servidor.
O que significam \d \w e \s em regex?
\d representa qualquer digito, \w representa caractere de palavra (alfanumerico e sublinhado) e \s representa espaco em branco. As versoes em maiuscula sao as negacoes dessas classes.
O que e lookahead e para que serve?
Lookahead e uma assercao que verifica se um padrao aparece depois da posicao atual sem consumir caracteres. Ele e muito util em validacoes como senhas fortes e filtros mais especificos.
O que e backtracking catastrofico e como evitar?
E quando uma regex ambigua obriga o motor a testar um numero enorme de combinacoes. Para evitar isso, use padroes mais especificos, evite quantificadores aninhados e prefira grupos atomicos ou quantificadores possessivos quando houver suporte.
Regex funciona igual em todas as linguagens?
Nao. A sintaxe basica e parecida, mas cada linguagem tem seu proprio flavor. Existem diferencas em lookbehind, suporte a Unicode, recursion, escapes e recursos avancados.