As expressões regulares têm a reputação de parecer ruído aleatório. Um padrão como ^[\w.-]+@[\w-]+\.\w{2,}$ pode parecer que um gato andou sobre o teclado. Mas por detrás da sintaxe críptica esconde-se uma ideia notavelmente elegante: uma linguagem concisa para descrever padrões em texto.
Quer esteja a validar entradas de formulários, a pesquisar ficheiros de log, a limpar dados ou a fazer localizar e substituir num código inteiro, o regex é uma das ferramentas mais versáteis no kit de um programador. E não precisa de memorizar cada funcionalidade obscura para obter valor real. Um punhado de blocos de construção cobre a grande maioria dos casos práticos.
O que o regex realmente faz
Uma expressão regular (regex ou regexp) é um padrão que descreve um conjunto de cadeias de caracteres. Fornece-o a um motor de pesquisa — na sua linguagem de programação, editor de texto ou ferramenta de linha de comandos — e ele encontra todas as cadeias que correspondem.
Pense nisto como uma consulta de pesquisa melhorada:
- Pesquisa normal: encontrar a palavra exata "error"
- Pesquisa com regex: encontrar qualquer coisa que se pareça com um endereço IP, uma data, um endereço de email ou qualquer estrutura que consiga descrever
O regex foi inventado pelo matemático Stephen Kleene em 1956 e entrou na informática através dos editores de texto Unix nos anos 60. Hoje é suportado em praticamente todas as linguagens de programação e editores de texto.
Os blocos de construção
Caracteres literais
O regex mais simples é texto puro. O padrão hello corresponde à cadeia "hello" onde quer que apareça. Nada de especial.
O ponto (.) — qualquer carácter
Um ponto corresponde a qualquer carácter individual exceto uma quebra de linha.
h.tcorresponde a "hat", "hit", "hot", "h3t" e até "h t"
Classes de caracteres ([])
Os parênteses retos definem um conjunto de caracteres permitidos numa posição.
[aeiou]— qualquer vogal[0-9]— qualquer dígito[A-Za-z]— qualquer letra[^0-9]— qualquer carácter que NÃO seja um dígito (o^dentro dos parênteses significa "não")
Classes abreviadas
| Abreviatura | Significado | Equivalente |
|---|---|---|
\d |
Qualquer dígito | [0-9] |
\w |
Carácter de palavra | [A-Za-z0-9_] |
\s |
Espaço em branco | [ \t\n\r] |
\D |
Não é um dígito | [^0-9] |
\W |
Não é carácter de palavra | [^A-Za-z0-9_] |
\S |
Não é espaço em branco | [^ \t\n\r] |
Quantificadores — quantos
Os quantificadores controlam quantas vezes o elemento anterior deve aparecer.
| Símbolo | Significado | Exemplo | Corresponde a |
|---|---|---|---|
* |
Zero ou mais | ab*c |
"ac", "abc", "abbc" |
+ |
Um ou mais | ab+c |
"abc", "abbc" (não "ac") |
? |
Zero ou um | colou?r |
"color" e "colour" |
{3} |
Exatamente 3 | \d{3} |
"123", "456" |
{2,4} |
Entre 2 e 4 | \d{2,4} |
"12", "123", "1234" |
Âncoras — posição
^— início da cadeia (ou linha, com a flagm)$— fim da cadeia (ou linha)\b— limite de palavra
O padrão ^\d{4}$ corresponde a uma cadeia que é exatamente quatro dígitos, como "2026", mas não a "abc2026" ou "2026xyz".
Grupos e alternância
(abc)— captura "abc" como grupoa|b— corresponde a "a" ou "b"(cat|dog)— corresponde a "cat" ou "dog"
Os grupos também permitem aplicar quantificadores a sequências: (ha)+ corresponde a "ha", "haha", "hahaha".
Padrões práticos comuns
Validar um email (básico)
^[\w.-]+@[\w-]+\.\w{2,}$
Isto corresponde a user@example.com, first.last@company.co.uk (parcialmente) e rejeita cadeias sem @ ou domínio.
Importante: Validar perfeitamente endereços de email com regex é notoriamente difícil — a especificação completa RFC 5322 é extremamente complexa. Para sistemas em produção, use um regex básico para verificação de formato e depois verifique o endereço enviando um email de confirmação.
Corresponder um número de telefone
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Isto lida com formatos como +1 555 123 4567, 555-123-4567 e (555) 123-4567.
Corresponder um URL
https?://[\w.-]+(/[\w./?&=-]*)?
Corresponde a https://example.com, http://example.com/path?q=hello.
Corresponder uma data (AAAA-MM-DD)
\d{4}-\d{2}-\d{2}
Corresponde a 2026-03-29, 1999-12-31. Nota: isto verifica apenas o formato, não a validade — também corresponderia a 9999-99-99.
Flags que alteram o comportamento
A maioria dos motores regex suporta flags que modificam a forma como o padrão é aplicado:
| Flag | Nome | Efeito |
|---|---|---|
g |
Global | Encontrar todas as correspondências, não apenas a primeira |
i |
Insensível a maiúsculas | hello corresponde a "Hello", "HELLO", etc. |
m |
Multilinha | ^ e $ correspondem ao início/fim de cada linha |
s |
Dotall | . também corresponde a caracteres de quebra de linha |
Em JavaScript, as flags são adicionadas após a barra de fecho: /hello/gi. Em Python, são passadas como argumentos: re.findall(r"hello", text, re.IGNORECASE).
Quando o regex é excessivo
O regex é poderoso, mas nem sempre é a ferramenta certa:
- Analisar HTML ou XML. Use um parser DOM adequado. O regex não consegue lidar de forma fiável com etiquetas aninhadas.
- Analisar JSON. Use
JSON.parse()ou equivalente. O regex vai falhar nos casos especiais. - Validação complexa. Se o seu padrão se estende por múltiplas linhas e demora cinco minutos a ler, considere escrever código de validação procedural.
- Operações simples com strings. Se só precisa de
startsWith(),includes()ousplit(), os métodos de string simples são mais claros e rápidos.
Armadilhas comuns
- Esquecer de escapar caracteres especiais. O ponto
.corresponde a qualquer carácter. Para corresponder a um ponto literal, use\.. O mesmo para(,),[,],+,*,?,{,},^,$,|e\. - Correspondência gananciosa vs preguiçosa. Por defeito,
.*é ganancioso — corresponde o máximo possível. Adicione?para o tornar preguiçoso:.*?corresponde o mínimo possível. Isto importa ao extrair conteúdo entre delimitadores. - Backtracking catastrófico. Quantificadores aninhados como
(a+)+podem fazer o motor tentar um número exponencial de caminhos em certas entradas, congelando o seu programa. Evite repetição aninhada em padrões sobrepostos. - Esquecer as âncoras. Sem
^e$, o seu padrão corresponde a subcadeias.\d{3}encontra "123" dentro de "abc12345". Use^\d{3}$se precisa de uma correspondência exata.
Para saber mais
A melhor forma de aprender regex é experimentar. Escreva um padrão, cole algum texto de teste e veja o que fica destacado. Ajuste e itere até compreender como cada peça funciona.
- Como testar padrões Regex — tutorial interativo com exemplos
- Regex Tester — cole o seu padrão e dados de teste, veja as correspondências destacadas em tempo real
