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 bandeiram.$corresponde ao final da cadeia, ou de cada linha comm.\bcorresponde 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,$2em 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 comomatch.groups.year.a|bcorresponde 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)\1encontra 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):acorresponde 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.monthem vez dem[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.