Utilo

Regex Cheat Sheet: Padrões, bandeiras e exemplos do mundo real

Uma folha prática de expressões regulares com classes de caracteres, quantificadores, âncoras, grupos, soluções alternativas, flags e padrões testados para tarefas diárias.

· 5 min de leitura

As expressões regulares são uma linguagem compacta para descrever texto. Uma única linha pode validar a entrada, extrair dados de registos ou renomear centenas de arquivos. A sintaxe é densa, no entanto, e pequenos erros produzem padrões que quase funcionam. Esta folha de truques reúne a sintaxe que você usará diariamente, explica as partes que atrapalham as pessoas e termina com padrões testados que você pode adaptar. Todos os exemplos usam sintaxe JavaScript, que também é muito próxima de Python, Java, Go e .NET.

Tente cada padrão em um [testador de regex] ((/ ferramentas/testador de regex) como você lê; ver correspondências destacadas é a maneira mais rápida de construir intuição.

Caracteres literais e fuga

A maioria dos personagens se correspondem: cat corresponde a "gato". Doze caracteres têm um significado especial e devem ser eliminados com uma barra de retorno para corresponder literalmente:

. * + ? ^ $ { } ( ) | [ ] \ /

Então 3.14 corresponde a "3.14" mas também a "3x14", enquanto 3\.14 corresponde apenas a "3.14".

Classes de caracteres

Padrão Combustíveis
. Qualquer caractere, exceto uma linha nova (a menos que a bandeira s esteja definida)
\d Um dígito 09
\w Caractere de palavra: letra, dígito ou sublinhado
\s Espaços em branco: espaço, guia, linha nova
\D, \W, \S O oposto do acima
[abc] Um dos a, b ou c
[a-z] Qualquer letra ASCII minúscula
[^0-9] Qualquer caracter que não seja um dígito
\p{L} Qualquer letra em qualquer escrita (exige a bandeira u)

Dentro de parênteses quadrados, a maioria dos caracteres especiais perdem seu significado. [.] corresponde a um ponto literal. Um hífen é literal quando colocado em primeiro ou último: [-a-z].

Quantificadores

Padrão Significado
a* Zero ou mais
a+ Um ou mais
a? Zero ou um (facultativo)
a{3} Exatamente três .
a{2,5} Entre as duas e as cinco .
a{2,} Dois ou mais

Os quantificadores são gananciosos: combinam o máximo possível e depois regressam. Adicionar ? torna-os preguiçosos. Dado <b>bold</b>, o padrão <.+> corresponde a toda a cadeia, enquanto <.+?> corresponde apenas a <b>.

Ancoras e limites

  • ^ corresponde ao início da cadeia, ou de cada linha com a bandeira m.
  • $ corresponde ao final da cadeia, ou de cada linha com m.
  • \b corresponde a um limite de palavras: a posição entre um caracter de palavra e um caracter não-palavra.

\bcat\b corresponde a "gato" em "o gato sentou" mas não em "concatenado". As âncoras são essenciais para a validação: \d{5} encontra cinco dígitos em qualquer lugar em "abc123456", enquanto ^\d{5}$ requer que toda a entrada seja exatamente de cinco dígitos.

Grupos e alternância

  • (abc) grupos e capturas. O texto capturado está disponível como $1, $2 em substituições.
  • (?:abc) grupos sem capturar, que é mais rápido e mantém a numeração limpa.
  • (?<year>\d{4}) é um grupo nomeado, acessível como match.groups.year.
  • a|b corresponde a ou b. A alternância tem a prioridade mais baixa, então ^cat|dog$ significa "começa com gato" ou "acaba com cão". Use ^(?:cat|dog)$ para combinar exatamente uma das palavras.
  • \1 é uma referência ao grupo 1: (\w)\1 encontra letras duplicadas como "ll" em "hello".

Olhe por aí .

Lookarounds afirmam que algo está ou não está ao lado da posição atual sem consumir caracteres.

Padrão Significado
(?=...) Previsão positiva: seguido de
(?!...) Previsão negativa: não seguida de
(?<=...) Positive lookbehind: precedido por
(?<!...) Negativo lookbehind: não precedido por

Exemplos: \d+(?=px) corresponde ao número em "16px" sem "px"; (?<=\$)\d+ corresponde ao valor após um sinal de dólar; ^(?!.*password).*$ corresponde a linhas que não contêm "senha".

Bandeiras

  • g (global): encontrar todas as correspondências em vez de parar no primeiro.
  • i (casos ignorados): a corresponde a "A".
  • m (multiline): ^ e $ correspondem nas quebras de linha.
  • s (dotAll): . também corresponde a novas linhas.
  • u (unicode): trata pares de substituição, como emoji, como caracteres únicos e permite \p{...}.
  • y (sticky): correspondências somente na posição onde a última correspondência terminou.

Padrões para tarefas diárias

Estes são práticos, não exaustivos. A validação real deve ser combinada com verificações do lado do servidor.

E-mail (pragmático):

^[^\s@]+@[^\s@]+\.[^\s@]{2,}$

Apanha erros de digitação como um @ ou domínio faltando; a única validação real é enviar um e-mail de confirmação.

** URL slug:**

^[a-z0-9]+(?:-[a-z0-9]+)*$

Data ISO (AAAA-MM-DD):

^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])$

Isso verifica a forma e os intervalos, mas não se existe 31 de fevereiro; analise a data para confirmar.

Color hex:

^#(?:[0-9a-fA-F]{3}){1,2}$

Endereço IPv4:

^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$

** Versão semântica:**

^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[\w.-]+)?(?:\+[\w.-]+)?$

Control de senha forte (pelo menos 12 caracteres, uma minúscula, uma maiúscula, um dígito):

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$

** Reduzir espaços em branco:** substituir ^\s+|\s+$ (com g) por uma cadeia vazia.

** Colapso de espaços repetidos:** substituir {2,} por um único espaço.

Extrair pares de chaves=valores de uma linha de log:

(\w+)=("[^"]*"|\S+)

** camelCase para snake_case:** substitua ([a-z0-9])([A-Z]) por $1_$2, em seguida, minúsculo o resultado. Para mais informações sobre estilos de nomeação, consulte [camelCase vs snake_case] ((/blog/naming-conventions-camelcase-snake-case).

Desempenho e retrocesso catastrófico

Os motores Regex em JavaScript, Python e Java usam retrocesso. Alguns padrões forçam o motor a tentar um número exponencial de combinações em entradas que quase correspondem. O exemplo clássico é ^(a+)+$ contra "aaaaaaaaaaaaaaaaaaaa!". Cada "a" extra duplica o trabalho, e algumas dezenas de caracteres podem congelar um servidor um vetor de negação de serviço conhecido como ReDoS.

Para evitá-lo:

  • Não aninhe quantificadores sobre os mesmos caracteres, como em (a+)+ ou (\w*)*.
  • Faça com que as alternativas se excluam mutuamente: (a|ab)* é arriscado; reestruturar.
  • Preferir classes específicas sobre .*: "[^"]*" é mais seguro e mais rápido do que ".*?".
  • Limite o comprimento de entrada antes de corresponder dados não confiáveis.

Dicas de legibilidade

  • Construir padrões complexos incrementalmente e testar cada peça.
  • Use grupos nomeados para que o código leia m.groups.month em vez de m[2].
  • Comentar padrões complicados no código, ou construí-los a partir de cadeias menores.
  • Se um padrão precisa de mais de uma linha ou duas, considere se um pequeno analisador seria mais claro.

Resumo

Aprenda o núcleo classes, quantificadores, âncoras, grupos e bandeiras e você pode ler a maioria dos regexes que encontrar. Use quantificadores preguiçosos e âncoras deliberadamente, procure por soluções alternativas quando você precisar de contexto sem consumir, observe quantificadores aninhados e sempre teste contra exemplos correspondentes e não correspondentes antes de enviar um padrão.

Esta página foi traduzida automaticamente do inglês. Se encontrar um erro, avise-nos.

Guias relacionados