Ir para o conteúdo

Cheatsheet de regex

As expressões regulares são compactas o suficiente para que a sintaxe seja mais fácil de consultar do que de decorar. Esta página é a totalidade dela num só ecrã — classes, quantificadores, âncoras, grupos, lookaround, escape e as flags — com um exemplo prático para cada linha.

A variante é a do JavaScript, que é o que corre no seu navegador e o que o testador de regex deste site usa. A maior parte é idêntica em Python, Java, Go e PCRE; onde as variantes divergem, divergem nas margens — o suporte de lookbehind, a sintaxe dos grupos nomeados e se \d significa "dígito ASCII" ou "qualquer dígito Unicode".

Duas coisas explicam a maioria das surpresas. Os quantificadores são gananciosos: agarram tudo o que podem e só devolvem quando o resto do padrão falha, e é por isso que <.+> engole duas tags e <.+?> não. E a alternância é a que liga mais fraco de todas, por isso ^a|b$ significa "começa por a, ou termina por b" — não o que a maioria das pessoas pretende quando o escreve.

Classes de caracteres

11

As abreviaturas limitam-se a ASCII, a não ser que acrescente a flag u e use escapes de propriedade Unicode.

SintaxeSignificadoExemplo
.Qualquer caractere exceto uma quebra de linhaAcrescente a flag s para que também corresponda a mudanças de linha./a.c/"abc" "abc"
\dUm dígito, 0–9/\d+/"order 42" "42"
\DTudo o que não seja um dígito/\D+/"42abc" "abc"
\wLetra, dígito ou underscoreApenas ASCII — "é" não é \w./\w+/"user_1!" "user_1"
\WTudo aquilo a que \w não corresponde/\W+/"a++b" "++"
\sQualquer espaço em branco, incluindo tabulações e mudanças de linha/\s+/"a \t b" " \t "
\SQualquer caractere que não seja espaço em branco/\S+/" hi" "hi"
[abc]Qualquer um dos caracteres listados/[aeiou]/"rhythm and" "a"
[^abc]Qualquer caractere exceto os listados/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Um intervalo de caracteres/[a-f]+/"zzabcz" "abc"
\p{L}Qualquer letra Unicode (precisa da flag u)/\p{L}+/"42 café" "café"

Quantificadores

7

Todos estes são gananciosos por predefinição: agarram o máximo que podem e só devolvem se o resto do padrão falhar.

SintaxeSignificadoExemplo
*Zero ou mais/ab*/"a" "a"
+Um ou mais/ab+/"abbb" "abbb"
?Zero ou um — torna-o opcional/colou?r/"color" "color"
{3}Exatamente três/\d{3}/"id 12345" "123"
{2,}Dois ou mais/a{2,}/"aaa" "aaa"
{2,4}Entre dois e quatro/a{2,4}/"aaaaa" "aaaa"
*?Preguiçoso — agarra o mínimo possívelO ganancioso <.+> engoliria ambas as tags./<.+?>/"<a><b>" "<a>"

Âncoras e limites

4

Estes correspondem a uma posição, não a um caractere, pelo que não consomem nada.

SintaxeSignificadoExemplo
^Início da cadeia, ou de uma linha com a flag m/^a/"abc" "a"
$Fim da cadeia, ou de uma linha com a flag m/c$/"abc" "c"
\bUm limite de palavraÉ isto que impede "cat" de corresponder dentro de "concatenate"./\bcat\b/"the cat sat" "cat"
\BNão é um limite de palavra/\Bcat/"concatenate" "cat"

Grupos e alternância

5
SintaxeSignificadoExemplo
(abc)Grupo de captura — memorizado para substituição/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Agrupamento sem capturaUse isto quando só precisa do agrupamento; mantém os números de captura com significado./(?:ab)+/"abab" "abab"
(?<name>…)Grupo de captura nomeado/(?<year>\d{4})/"in 2026" "2026"
a|bQualquer um dos lados — alternânciaA alternância tem a precedência mais baixa: ^a|b$ é "^a" ou "b$", não "^(a|b)$"./cat|dog/"one dog" "dog"
\1Referência regressiva ao primeiro grupo/(\w)\1/"letter" "tt"

Lookaround

4

Asserções sobre o que rodeia uma posição. Não correspondem a nada em si, e é isso que as torna seguras de combinar.

SintaxeSignificadoExemplo
(?=…)Lookahead — seguido por isto/\d+(?= kg)/"80 kg" "80"
(?!…)Lookahead negativo — não seguido por isto/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — precedido por isto/(?<=\$)\d+/"costs $40" "40"
(?<!…)Lookbehind negativo — não precedido por isto/(?<!\$)\b\d+/"about 40" "40"

Escape

5

Estes doze caracteres são os que precisam de uma barra invertida para serem tomados literalmente.

SintaxeSignificadoExemplo
\.Um ponto literal/\d\.\d/"v2.5" "2.5"
\\Uma barra invertida literal/\\/"C:\\dir" "\\"
\nUm avanço de linha/a\nb/"a\nb" "a\nb"
\tUma tabulação/a\tb/"a\tb" "a\tb"
\uFFFFUm caractere pelo seu ponto de código/\u00e9/"café" "é"

Flags

6
FlagNomeSignificado
gGlobalEncontra todas as correspondências, não apenas a primeira.
iIgnorar maiúsculas/minúsculasCorresponde independentemente de ser maiúscula ou minúscula.
mMultilinhaFaz com que ^ e $ correspondam em cada quebra de linha, em vez de apenas nas extremidades da cadeia.
sDot allPermite que . corresponda também a quebras de linha.
uUnicodeTrata o padrão como pontos de código e ativa os escapes de propriedade \p{…}.
yStickyCorresponde apenas exatamente em lastIndex, sem nunca procurar para a frente.

FAQ

Qual é a diferença entre quantificadores gananciosos e preguiçosos?
Os quantificadores gananciosos (*, +, {2,}) correspondem ao máximo possível e só devolvem caracteres quando o resto do padrão não consegue corresponder. Acrescentar ? torna-os preguiçosos: correspondem ao mínimo possível e só agarram mais quando são forçados. Em "<a><b>", o padrão <.+> devolve a cadeia inteira e <.+?> devolve apenas <a>.
Porque é que a minha palavra corresponde dentro de outras palavras?
Porque nada a ancorou. Envolva a palavra em \b — /\bcat\b/ corresponde a "cat" em "the cat sat", mas não dentro de "concatenate". \b corresponde a uma posição entre um caractere de palavra e um que não o é, pelo que não consome nada.
O que é que a flag u altera?
Faz o padrão operar sobre pontos de código em vez de unidades UTF-16, por isso um único emoji conta como um caractere, e ativa os escapes de propriedade \p{…} como \p{L} para "qualquer letra". Sem ela, \w e \d ficam limitados a ASCII, e é por isso que "café" não corresponde por completo a /\w+/.
Quando devo usar um grupo sem captura?
Sempre que precisar do agrupamento mas não do texto capturado — (?:ab)+ em vez de (ab)+. As capturas custam algum desempenho, mas a verdadeira razão é a numeração: cada grupo de captura que acrescenta desloca os números dos que vêm a seguir, quebrando silenciosamente substituições que usam $1 e $2.
É seguro usar lookbehind?
Nos navegadores atuais e no Node, sim — (?<=…) e (?<!…) são suportados em todos os motores importantes desde 2018. O Safari foi o último a adicioná-lo. Se estiver a visar ambientes de execução muito antigos, verifique primeiro; não há polyfill para sintaxe de regex.