Padrões regex são templates reutilizáveis que identificam sequências específicas de caracteres em um texto - pense neles como uma ferramenta de "busca" turbinada, que funciona em praticamente qualquer linguagem de programação. Seja para validar um endereço de e-mail, extrair um número de telefone de um formulário ou analisar um arquivo de log, um conjunto bem escolhido de expressões regulares resolve 90% do que você precisa. Este guia reúne os padrões mais úteis na prática, explica exatamente o que cada um faz e mostra como adaptá-los.
Índice
Revisão Rápida de Sintaxe Regex
Antes de mergulhar nos padrões, confira este resumo dos blocos de construção que você vai encontrar repetidamente. Mesmo que você já tenha usado regex antes, é útil ter tudo isso em um só lugar.
| Token | Significado | Exemplo de correspondência |
|---|---|---|
.
|
Qualquer caractere, exceto nova linha |
a.c
corresponde a
abc
,
a1c
|
\d
|
Qualquer dígito (0-9) |
\d\d
corresponde a
42
|
\w
|
Caractere de palavra (letras, dígitos, sublinhado) |
\w+
corresponde a
hello_world
|
\s
|
Espaço em branco (espaço, tabulação, nova linha) |
\s+
corresponde a múltiplos espaços
|
^
/
$
|
Início / fim da string |
^\d+$
corresponde apenas a
123
|
{n,m}
|
Entre n e m repetições |
\d{2,4}
corresponde de
12
a
1234
|
[abc]
|
Classe de caracteres - qualquer um entre a, b, c |
[aeiou]
corresponde a qualquer vogal
|
(?:...)
|
Grupo sem captura | Agrupa sem armazenar uma referência retroativa |
(?=...)
|
Lookahead positivo | Verifica o que vem a seguir sem consumi-lo |
O guia de expressões regulares do MDN Web Docs é a melhor referência única para sintaxe regex em JavaScript, e a maioria dos padrões abaixo se aplica diretamente ao Python, PHP, Java e Ruby, com pequenas diferenças de flags.
Validação de E-mail
E-mail é o caso de uso clássico de regex - e também aquele em que a maioria dos desenvolvedores erra ao tentar ser restrita demais. A
especificação RFC 5322
tecnicamente permite endereços como
"very unusual"@example.com
, que quase nenhum regex consegue tratar. Para 99% da validação de entrada no mundo real, use um padrão pragmático:
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$
O que cada parte faz:
-
[a-zA-Z0-9._%+\-]+- parte local (antes do @); permite pontos, sinais de mais, hifens e sublinhados -
@- o símbolo @ literal -
[a-zA-Z0-9.\-]+- nome de domínio, incluindo subdomínios -
\.[a-zA-Z]{2,}- TLD com pelo menos 2 caracteres (.io, .com, .museum)
URLs e Endereços Web
O pattern matching de URLs cobre desde a extração de links em texto simples até a validação de um campo de site informado pelo usuário.
https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)
-
https?- corresponde tanto ahttpquanto ahttps -
(?:www\.)?- prefixo www opcional -
[-a-zA-Z0-9@:%._+~#=]{1,256}- caracteres do hostname, até 256 caracteres -
\.[a-zA-Z0-9()]{1,6}- TLD -
\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)- caminho, query string e fragmento opcionais
Se você só precisa validar (e não extrair), envolva o padrão com as âncoras
^
e
$
.
Números de Telefone
Números de telefone são notoriamente complicados porque a formatação varia muito por país e pelo hábito de cada usuário. Dois padrões cobrem a maioria dos cenários:
Formato EUA/Canadá (NANP)
^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$
Corresponde a:
555-867-5309
,
(555) 867 5309
,
+1.555.867.5309
,
5558675309
Internacional (formato E.164)
^\+[1-9]\d{6,14}$
E.164 é o formato usado pela maioria das APIs de telefonia (Twilio, AWS SNS). Começa com
+
e um código de país, sem espaços ou pontuação.
Datas e Horários
O pattern matching de datas é comum em parsers de log, validadores de formulários e pipelines de dados. O formato que você precisa depende da sua fonte de entrada.
ISO 8601 (YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
Formato norte-americano (MM/DD/YYYY)
^(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/\d{4}$
Horário no formato 24 horas (HH:MM ou HH:MM:SS)
^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?$
Observe que esses padrões validam o formato, não a lógica do calendário. Eles aceitarão
2024-02-31
(31 de fevereiro não existe). Para uma validação de data rigorosa, faça o parse com a biblioteca de datas da sua linguagem após a verificação com regex.
Validação de Força de Senha
As regras de senha geralmente exigem uma combinação de tipos de caracteres e um comprimento mínimo. Lookaheads tornam isso mais limpo sem precisar de múltiplas verificações separadas.
Mínimo de 8 caracteres, pelo menos uma letra maiúscula, uma minúscula e um dígito
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
Senha forte: 8+ caracteres, maiúscula, minúscula, dígito e caractere especial
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,}$
Cada
(?=.*[...])
é um lookahead que percorre toda a string em busca de pelo menos um caractere correspondente. O
.{8,}
final impõe o comprimento mínimo. Você pode substituir
{8,}
por
{12,}
para exigir no mínimo 12 caracteres, o que está alinhado com as
diretrizes NIST SP 800-63B
.
Endereços IP
IPv4
^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$
Este padrão rejeita corretamente valores como
999.0.0.1
ao verificar cada octeto explicitamente no intervalo de 0 a 255.
IPv6 (simplificado)
^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
Este padrão cobre o formato completo de 8 grupos. Para a notação comprimida (por exemplo,
::1
para loopback), o padrão se torna significativamente mais complexo - nesse ponto, usar uma biblioteca de rede é mais confiável do que regex.
HTML e Markup
Alguns padrões específicos são genuinamente úteis aqui. O conselho geral de "não faça parse de HTML com regex" ainda vale para documentos completos - use um parser de DOM adequado como BeautifulSoup ou DOMParser para isso. Mas para tarefas específicas e bem delimitadas, regex funciona perfeitamente.
Remover todas as tags HTML
<[^>]*>
Extrair conteúdo de uma tag específica (por exemplo, <title>)
([^<]*)<\/title>
O grupo de captura 1 contém o texto do título.
Corresponder a códigos de cor hexadecimais HTML
#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})\b
Corresponde tanto à forma abreviada de 3 dígitos (
#fff
) quanto à forma completa de 6 dígitos (
#ffffff
).
Padrões Utilitários do Dia a Dia
Estes aparecem com frequência em diferentes tipos de projetos.
Slug (string amigável para URL)
^[a-z0-9]+(?:-[a-z0-9]+)*$
Corresponde a strings como
my-blog-post-2024
. Sem letras maiúsculas, sem hifens no início ou no fim, sem hifens duplos.
Número de cartão de crédito (formato básico, sem espaços)
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
-
Começa com
4- Visa (13 ou 16 dígitos) -
Começa com
51-55- Mastercard (16 dígitos) -
Começa com
34ou37- Amex (15 dígitos) -
Começa com
6011ou65- Discover (16 dígitos)
Normalização de espaços em branco (colapsar múltiplos espaços)
\s{2,}
Substitua as correspondências por um único espaço para limpar entradas de usuário bagunçadas ou texto extraído por scraping.
Somente dígitos
^\d+$
Somente alfanuméricos
^[a-zA-Z0-9]+$
Corresponder a uma linha que contém uma palavra (sem distinção de maiúsculas/minúsculas com flag)
^.*\bword\b.*$
O limite de palavra
\b
evita que
word
seja encontrado dentro de
password
.
Extrair números de versão (semver)
\bv?(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.]+))?(?:\+([a-zA-Z0-9.]+))?\b
Captura major, minor, patch, rótulo de pré-lançamento e metadados de build a partir de strings como
v2.14.0-beta.1+build.42
.
Flags e Dicas Práticas
Os padrões regex se comportam de forma diferente dependendo das flags aplicadas. As mais comumente necessárias:
| Flag | JS | Python | Efeito |
|---|---|---|---|
| Sem distinção de maiúsculas/minúsculas |
i
|
re.IGNORECASE
|
Trata maiúsculas e minúsculas como iguais |
| Global (encontrar todas) |
g
|
re.findall()
|
Retorna todas as correspondências, não apenas a primeira |
| Multilinha |
m
|
re.MULTILINE
|
^
e
$
correspondem aos limites de cada linha, não da string inteira
|
| Dotall |
s
|
re.DOTALL
|
.
também corresponde a caracteres de nova linha
|
Alguns hábitos que vão te poupar tempo de depuração:
- Sempre teste com casos extremos - string vazia, comprimento máximo, caracteres Unicode e strings que são quase, mas não completamente, válidas.
-
Use grupos sem captura
(?:...)quando você não precisa do conteúdo correspondido - é mais rápido e mais limpo do que grupos de captura. -
Ancore seus padrões de validação
com
^e$para que uma substring aparentemente válida dentro de uma string inválida não passe despercebida. -
Cuidado com o backtracking catastrófico
- quantificadores aninhados como
(a+)+podem fazer o motor de regex travar com entradas manipuladas. Mantenha os quantificadores simples e específicos. - Use um testador de regex enquanto constrói seus padrões. regex101.com exibe uma análise ao vivo das correspondências, explica cada token e permite alternar entre os modos PCRE, JavaScript, Python e outros.
Teste e valide padrões regex sem achismos
Criar padrões regex confiáveis para validação de entrada é muito mais rápido quando você tem as ferramentas certas à mão. Explore nossos utilitários gratuitos para desenvolvedores e limpe, verifique e transforme texto usando regex e muito mais.
Experimente Nossas Ferramentas Gratuitas →
Quantificadores gulosos (como
.*
) correspondem ao máximo possível e depois fazem backtracking. Quantificadores preguiçosos (como
.*?
) correspondem ao mínimo possível. Por exemplo, na string
bold
, o padrão
<.*>
corresponde à string inteira, enquanto
<.*?>
corresponde apenas a
. Use quantificadores preguiçosos ao extrair conteúdo entre delimitadores.
Na maioria das vezes sim, mas há diferenças. O módulo
re
do Python usa sintaxe no estilo PCRE e suporta grupos nomeados com
(?P
. O JavaScript usa uma sintaxe de flags ligeiramente diferente e não suporta lookbehinds em motores mais antigos (anteriores ao ES2018). Para código que funcione em múltiplas linguagens, fique com o subconjunto comum: classes de caracteres, quantificadores, âncoras e grupos básicos.
Regex é perfeitamente adequado para validação de formato em produção - é usado em praticamente todos os frameworks web. Os riscos estão em padrões mal escritos que permitem ataques ReDoS (negação de serviço via regex) por backtracking catastrófico. Evite quantificadores aninhados, mantenha os padrões específicos e sempre defina um limite razoável de comprimento de entrada antes de o regex sequer ser executado.
Na maioria dos motores comuns, eles são equivalentes para entrada ASCII. A diferença aparece com Unicode:
\d
em alguns motores (como Python 3 com modo Unicode) pode corresponder a dígitos de outros sistemas de escrita, como os numerais indo-arábicos. Se você quer estritamente os dígitos ASCII de 0 a 9, use
[0-9]
para ser explícito. Para a maioria da validação de formulários web, essa distinção não faz diferença.
Você precisa de duas coisas: a
flag dotall
(para que
.
corresponda a novas linhas) e possivelmente a
flag multilinha
(para que
^
e
$
ancorem em cada linha em vez de na string inteira). Em JavaScript, use
/pattern/ms
. Em Python, combine
re.DOTALL | re.MULTILINE
. Sem o dotall,
.
para nas quebras de linha e seu padrão não abrangerá múltiplas linhas.