Como usar expressoes regulares (regex): guia completa para desenvolvedores

12 min de leitura

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:

MetacaractereSignificadoExemploCorresponde 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/cadeiamundo$"Ola mundo" (so no fim)
*0 ou mais repeticoesab*c"ac", "abc", "abbc", "abbbc"
+1 ou mais repeticoesab+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 [ ]:

PadraoSignificadoExemplo 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:

AtalhoEquivalenteSignificado
\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:

QuantificadorSignificadoExemploCorresponde 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:

SintaxeTipoDescricao
(padrao)Grupo de capturaAgrupa e captura o texto
(?:padrao)Grupo sem capturaAgrupa sem armazenar
(?<nome>padrao)Grupo nomeadoCaptura com nome identificavel
\1, \2BackreferenceReferencia 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:

SintaxeNomeSignificado
(?=padrao)Positive lookaheadO que vem depois DEVE corresponder
(?!padrao)Negative lookaheadO que vem depois NAO deve corresponder
(?<=padrao)Positive lookbehindO que vem antes DEVE corresponder
(?<!padrao)Negative lookbehindO 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:

FlagNomeEfeito
gGlobalEncontra todas as correspondencias
iCase insensitiveIgnora diferencas entre maiusculas e minusculas
mMultiline^ e $ funcionam por linha
sDotallO ponto tambem pega quebras de linha
uUnicodeSuporte 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.