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:

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.

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:

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

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:

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

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.

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:

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.