Caracteres
| Padrão | Corresponde a | Exemplo de correspondencia |
|---|
. | Qualquer caractere exceto nova linha | a.c corresponde a abc, a1c, a-c |
\d | Qualquer digito [0-9] | \d{3} corresponde a 123 |
\D | Qualquer não digito | \D+ corresponde a abc em abc123 |
\w | Caractere de palavra [a-zA-Z0-9_] | \w+ corresponde a hello_world |
\W | Caractere que não e de palavra | \W corresponde a @ em user@host |
\s | Espaço em branco (espaço, tabulação, nova linha) | \s+ corresponde a espaços entre palavras |
\S | Não espaço em branco | \S+ corresponde a hello |
\t | Caractere de tabulação | |
\n | Nova linha | |
Quantificadores
| Padrão | Significado | Exemplo |
|---|
* | 0 ou mais (guloso) | ab*c corresponde a ac, abc, abbc |
+ | 1 ou mais (guloso) | ab+c corresponde a abc, abbc mas não ac |
? | 0 ou 1 (opcional) | colou?r corresponde a color e colour |
{3} | Exatamente 3 | \d{3} corresponde a 123 mas não 12 |
{2,5} | Entre 2 e 5 | \w{2,5} corresponde de ab a abcde |
{3,} | 3 ou mais | \d{3,} corresponde a 123, 1234, 12345 |
*? | 0 ou mais (preguiçoso) | ".*?" corresponde a string entre aspas mais curta |
+? | 1 ou mais (preguiçoso) | <.+?> corresponde a uma única tag HTML |
Ancoras
| Padrão | Corresponde a | Exemplo |
|---|
^ | Inıcio da string (ou linha com flag m) | ^Ola corresponde a Ola mundo |
$ | Final da string (ou linha com flag m) | mundo$ corresponde a Ola mundo |
\b | Limite de palavra | \bgato\b corresponde a gato mas não gatos ou concatenate |
\B | Limite que não e de palavra | \Bgato\B corresponde a concatenate mas não gato |
Grupos e Alternação
| Padrão | Significado | Exemplo |
|---|
(abc) | Grupo de captura | (ha)+ corresponde a haha, captura ha |
(?:abc) | Grupo não capturador | (?:ha)+ corresponde a haha, sem captura |
(?<nome>abc) | Grupo de captura nomeado | (?<ano>\d{4}) captura ano pelo nome |
a|b | Alternação (ou) | gato|cão corresponde a gato ou cão |
\1 | Retroreferencia ao grupo 1 | (\w+)\s\1 corresponde a the the |
Classes de Caracteres
| Padrão | Corresponde a | Exemplo |
|---|
[abc] | Qualquer um de a, b ou c | [aeiou] corresponde a qualquer vogal |
[^abc] | Não a, b ou c | [^0-9] corresponde a qualquer não digito |
[a-z] | Intervalo: de a a z | [a-zA-Z] corresponde a qualquer letra |
[a-zA-Z0-9] | Alfanumerico | Igual a \w menos sublinhado |
Lookaheads e Lookbehinds
Asserções de largura zero: elas verificam uma condição sem consumir caracteres.
| Padrão | Tipo | Significado | Exemplo |
|---|
(?=foo) | Lookahead positivo | Seguido por foo | \d+(?= USD) corresponde a 100 em 100 USD |
(?!foo) | Lookahead negativo | NAO seguido por foo | \d+(?! USD) corresponde a 200 em 200 EUR |
(?<=foo) | Lookbehind positivo | Precedido por foo | (?<=\$)\d+ corresponde a 50 em $50 |
(?<!foo) | Lookbehind negativo | NAO precedido por foo | (?<!\$)\d+ corresponde a 50 em EUR 50 |
Lookbehinds devem ter comprimento fixo na maioria dos motores. JavaScript adicionou lookbehinds de comprimento variavel no ES2018, mas o suporte do Safari ficou defasado até 2023.
Flags
| Flag | Nome | Efeito |
|---|
g | Global | Encontra todas as correspondencias, não apenas a primeira |
i | Insensível a maiusculas/minusculas | a corresponde a A e a |
m | Multilinha | ^ e $ correspondem a inıcio/fim de linha, não apenas da string |
s | Dotall | . corresponde também a caracteres de nova linha |
u | Unicode | Habilita correspondencia Unicode completa e tratamento adequado de pares substitutos |
Padrões Comuns
Estes cobrem a maioria das necessidades de válidação do mundo real. Todos os padrões são simplificados para legibilidade. Sistemas de produção devem usar analisadores dedicados para formatos complexos como email (RFC 5322).
Email (simplificado)
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}
URL
https?://[^\s/$.?#].[^\s]*
Endereço IPv4
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
Não válida que os octetos estão entre 0-255. Para válidação rigorosa, use: \b(25[0-5]|2[0-4]\d|[01]?\d\d?)(\.(25[0-5]|2[0-4]\d|[01]?\d\d?)){3}\b
Data (AAAA-MM-DD)
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
Cor hexadecimal
#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})\b
Numero de telefone (EUA, flexıvel)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Corresponde a (555) 123-4567, 555-123-4567, 555.123.4567 e 5551234567.
Gulosó vs Preguiçosó
A surpresa mais comum com regex. Dada a entrada <b>negrito</b> e <i>italico</i>:
| Padrão | Correspondencia | Por que |
|---|
<.+> | <b>negrito</b> e <i>italico</i> | Guloso: corresponde do primeiro < ao último > |
<.+?> | <b>, </b>, <i>, </i> | Preguiçoso: corresponde de cada < ao > mais próximo |
O comportamento padrão e guloso. Adicione ? a qualquer quantificador para torna-lo preguiçoso.
Notas Específicas do JavaScript
- Use a sintaxe
/padrão/flags ou new RegExp('padrão', 'flags')
string.match(/regex/g) retorna todas as correspondencias como um array
string.matchAll(/regex/g) retorna um iterador com detalhes dos grupos de captura
string.replace(/regex/g, substituição) substitui todas as correspondencias
- Grupos nomeados:
(?<nome>...) acessados via match.groups.nome
\d, \w, \s são apenas ASCII por padrão. Use a flag u para Unicode