Folha de Referência Regex: Padrões Comuns & Referência Rápida
· 12 min de leitura
Índice
Expressões regulares são uma das ferramentas mais poderosas no kit de um desenvolvedor, mas permanecem intimidantes para muitos programadores. Esta folha de referência abrangente divide padrões regex em seções digestíveis com exemplos práticos que você pode usar imediatamente.
Seja validando endereços de e-mail, analisando arquivos de log ou limpando dados bagunçados, este guia ajudará você a escrever melhores padrões regex mais rapidamente. Cobriremos tudo, desde correspondência básica de caracteres até asserções avançadas de lookaround.
Fundamentos de Regex
Expressões regulares (regex ou regexp) são padrões usados para corresponder combinações de caracteres em strings. Elas são suportadas em praticamente todas as linguagens de programação—JavaScript, Python, Java, PHP, Ruby, Go e mais—assim como em editores de texto como VS Code, Sublime Text e ferramentas de linha de comando como grep e sed.
Em sua essência, padrões regex consistem em dois tipos de caracteres: caracteres literais que correspondem a si mesmos exatamente, e metacaracteres que têm significados especiais e definem regras de correspondência.
O regex mais simples é uma string literal. O padrão hello corresponde ao texto "hello" exatamente onde quer que apareça. Mas o verdadeiro poder vem dos metacaracteres que adicionam flexibilidade—como corresponder qualquer dígito, repetir padrões ou ancorar em posições específicas.
Dica profissional: Use nosso Testador de Regex para experimentar com padrões em tempo real. Você verá correspondências destacadas instantaneamente enquanto digita, tornando muito mais fácil entender como os padrões funcionam.
Caracteres Literais vs Metacaracteres
A maioria dos caracteres em um padrão regex são literais—eles correspondem a si mesmos. O padrão cat corresponde às letras c, a e t nessa sequência exata. No entanto, certos caracteres têm significados especiais:
. ^ $ * + ? { } [ ] \ | ( )são metacaracteres- Para corresponder a estes literalmente, escape-os com uma barra invertida:
\.corresponde a um ponto - Dentro de classes de caracteres
[], a maioria dos metacaracteres perde seu significado especial
Por exemplo, example\.com corresponde a "example.com" literalmente, enquanto example.com corresponderia a "exampleXcom" porque o ponto sem escape corresponde a qualquer caractere.
Classes de Caracteres
Classes de caracteres permitem que você corresponda um caractere de um conjunto de possibilidades. Elas são a base da correspondência de padrões flexível e vêm em duas formas: classes abreviadas predefinidas e expressões de colchetes personalizadas.
| Padrão | Corresponde | Exemplo |
|---|---|---|
. |
Qualquer caractere exceto nova linha | h.t → hat, hot, hit, h@t |
\d |
Qualquer dígito [0-9] | \d{3} → 123, 456, 789 |
\D |
Qualquer não-dígito | \D+ → abc, xyz, @#$ |
\w |
Caractere de palavra [a-zA-Z0-9_] | \w+ → hello_world, var123 |
\W |
Caractere não-palavra | \W → @, #, espaço, pontuação |
\s |
Espaço em branco (espaço, tab, nova linha) | \s+ → qualquer sequência de espaços em branco |
\S |
Não-espaço em branco | \S+ → quaisquer caracteres visíveis |
[abc] |
Qualquer um de a, b ou c | [aeiou] → qualquer vogal |
[^abc] |
Não a, b ou c | [^0-9] → qualquer não-dígito |
[a-z] |
Intervalo: a até z | [A-Za-z] → qualquer letra |
[a-z0-9] |
Múltiplos intervalos | [a-fA-F0-9] → dígitos hexadecimais |
Classes de Caracteres Personalizadas
Expressões de colchetes [] permitem que você defina seus próprios conjuntos de caracteres. Dentro dos colchetes, a maioria dos metacaracteres perde seu significado especial—você não precisa escapá-los.
[aeiou]corresponde a qualquer vogal única[0-9]corresponde a qualquer dígito (equivalente a\d)[a-zA-Z]corresponde a qualquer letra, maiúscula ou minúscula[^0-9]corresponde a qualquer coisa exceto dígitos (o^nega a classe)[a-z-]corresponde a letras minúsculas ou um hífen (hífen no final é literal)
Dica rápida: A ordem dos caracteres em uma classe de caracteres não importa. [abc] e [bca] são idênticos. A classe corresponde se qualquer um dos caracteres estiver presente.
Exemplos Práticos
Aqui estão alguns usos do mundo real de classes de caracteres:
[A-Z][a-z]+corresponde a palavras capitalizadas como "Hello" ou "World"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}corresponde a endereços IP (padrão básico)[a-fA-F0-9]{6}corresponde a códigos de cores hexadecimais como "FF5733"[^\s]+corresponde a qualquer sequência de não-espaços em branco (uma "palavra" no sentido mais amplo)
Quantificadores e Repetição
Quantificadores especificam quantas vezes um padrão deve se repetir. Eles são colocados após o elemento que você deseja repetir—um caractere, classe de caracteres ou grupo.
| Quantificador | Significado | Exemplo |
|---|---|---|
* |
0 ou mais vezes | ab*c → ac, abc, abbc, abbbc |
+ |
1 ou mais vezes | ab+c → abc, abbc (não ac) |
? |
0 ou 1 vez (opcional) | colou?r → color, colour |
{n} |
Exatamente n vezes | \d{4} → 2026, 1999 |
{n,} |
n ou mais vezes | \w{3,} → palavras com 3+ caracteres |
{n,m} |
Entre n e m vezes | \d{2,4} → 12, 123, 1234 |
*? |
Correspondência preguiçosa/mínima (0 ou mais) | <.*?> → apenas primeira tag |
+? |
Correspondência preguiçosa/mínima (1 ou mais) | ".+?" → primeira string entre aspas |
?? |
Correspondência preguiçosa/mínima (0 ou 1) | \d?? → corresponde a 0 dígitos se possível |
Correspondência Gananciosa vs Preguiçosa
Este é um dos conceitos mais importantes em regex. Por padrão, quantificadores são gananciosos—eles correspondem ao máximo de texto possível enquanto ainda permitem que o padrão geral corresponda.
Considere a string HTML <b>bold</b> and <i>italic</i>:
<.*>(ganancioso) corresponde à string inteira do primeiro<ao último><.*?>(preguiçoso) corresponde apenas a<b>, depois</b>, depois<i>, depois</i>separadamente
Adicionar ? após um quantificador o torna preguiçoso (também chamado de não-ganancioso ou mínimo). Ele corresponde ao mínimo de texto possível enquanto ainda permite que o padrão tenha sucesso.
Dica profissional: Ao extrair conteúdo entre delimitadores (aspas, tags, colchetes), quase sempre use quantificadores preguiçosos. O padrão ".*?" extrai corretamente strings individuais entre aspas, enquanto ".*" corresponderia da primeira aspas à última aspas em todo o texto.
Padrões Comuns de Quantificadores
Aqui estão padrões que você usará constantemente:
\d+corresponde a um ou mais dígitos (números como 42, 1000, 7)\w+corresponde a um ou mais caracteres de palavra (identificadores, nomes de variáveis)\s*corresponde a espaço em branco opcional (zero ou mais espaços/tabs).+?corresponde a quaisquer caracteres preguiçosamente (conteúdo entre marcadores)[a-z]{2,}corresponde a palavras com pelo menos 2 letras minúsculas\d{3}-\d{3}-\d{4}corresponde a números de telefone como 555-123-4567
Âncoras e Limites
Âncoras não correspondem a caracteres—elas correspondem a posições na string. Elas são essenciais para garantir que padrões correspondam em locais específicos em vez de em qualquer lugar no texto.
| Âncora | Posição | Exemplo |
|---|---|---|
^ |
Início da string (ou linha com flag m) | ^Hello → corresponde a "Hello world" mas não a "Say Hello" |
$ |
Fim da string (ou linha com flag m) | end$ → corresponde a "The end" mas não a "end of story" |
\b |
Limite de palavra | \bcat\b → corresponde a "cat" mas não a "category" |
\B |
Não é um limite de palavra | \Bcat\B → corresponde a "concatenate" mas não a "cat" |
\A |
Início da string (nunca linha) | Como ^ mas ignora modo multilinha |
\Z |
Fim da string (nunca linha) | Como $ mas ignora modo multilinha |
Limites de Palavra Explicados
O limite de palavra \b é incrivelmente útil mas frequentemente mal compreendido. Ele corresponde à posição entre um caractere de palavra (\w) e um caractere não-palavra (\W), ou no início/fim da string.
Considere o padrão \bcat\b aplicado a diferentes strings:
- "the cat sat" → corresponde (cat está cercado por espaços)
- "category" → sem correspondência (cat é seguido pelo caractere de palavra 'e')
- "concatenate" → sem correspondência (cat é precedido e seguido por caracteres de palavra)
- "cat" → corresponde (cat está no início e fim da string)
- "cat!" → corresponde (cat é seguido por pontuação, um caractere não-palavra)
Isso torna \b perfeito para encontrar palavras inteiras sem acidentalmente corresponder partes de palavras maiores.
Âncoras de Início e Fim
As âncoras ^ e $ são essenciais para validação. Quando você quer garantir que uma string inteira corresponda a um padrão (não apenas contenha-o), envolva seu padrão com essas âncoras.
^\d+$garante que a string inteira seja dígitos (valida entrada numérica)^[A-Z]garante que a string comece com uma letra maiúscula[.!?]$garante que a string termine com pontuação^https?://garante que uma URL comece com http:// ou https://
Dica rápida: Ao validar entrada do usuário (e-mail, telefone, nome de usuário), sempre use ^ e $ para ancorar seu padrão. Sem eles, o padrão \d{3} aceitaria "abc123def" quando você provavelmente quer rejeitar qualquer coisa que não seja exatamente 3 dígitos.
Grupos e Captura
Parênteses () servem a dois propósitos em regex: eles agrupam partes de um padrão juntas, e capturam o texto correspondido para uso posterior. É aqui que regex se torna verdadeiramente poderoso para extração e transformação.
| Sintaxe | Propósito | Exemplo |
|---|---|---|
(abc) |
Grupo de captura | (\d{3})-(\d{4}) captura código de área e número |
(?:abc) |
Grupo sem captura | (?:https?://)?example\.com agrupa sem capturar |
(a|b) |
Alternância (OU) | (cat|dog) corresponde a "cat" ou "dog" |
\1 |
Referência retroativa ao grupo 1 | (\w+)\s+\1 corresponde a palavras repetidas como "the the" |
(?<name>abc) |
Grupo de captura nomeado | (?<year>\d{4})-(?<month>\d{2}) para datas |
Grupos de Captura
Quando você envolve parte de um padrão em parênteses, o motor regex captura o texto correspondido. Você pode então referenciar essas capturas em seu código ou até mesmo dentro do próprio regex usando referências retroativas.
Por exemplo, o padrão (\d{3})-(\d{3})-(\d{4}) aplicado a "555-123-4567" cria três capturas:
- Grupo 1: "555"
- Grupo 2: "123"
- Grupo 3: "4567"
Na maioria das linguagens de programação, você pode acessar essas capturas através de objetos de correspondência ou strings de substituição. Isso permite reformatar dados facilmente—transformando "555-123-4567" em "(555) 123-4567" com uma substituição como ($1) $2-$3.
Grupos Sem Captura
Às vezes você precisa de agrupamento para quantificadores ou alternância mas não precisa capturar o texto. Use (?:...) para isso.