Vai al contenuto

Scheda di riferimento regex

Le espressioni regolari sono abbastanza compatte che è più facile consultarne la sintassi che memorizzarla. Questa pagina la contiene tutta in una schermata — classi, quantificatori, ancoraggi, gruppi, lookaround, escape e i flag — con un esempio funzionante per ogni riga.

Il flavour è JavaScript, che è ciò che gira nel tuo browser e ciò che usa il tester regex di questo sito. Gran parte è identica in Python, Java, Go e PCRE; dove i flavour divergono, divergono ai margini — il supporto per il lookbehind, la sintassi dei gruppi denominati e se \d significhi "cifra ASCII" oppure "qualsiasi cifra Unicode".

Due cose spiegano la maggior parte delle sorprese. I quantificatori sono greedy: prendono tutto ciò che possono e restituiscono solo quando il resto del pattern fallisce, ed è per questo che <.+> ingoia due tag e <.+?> no. E l'alternanza ha la precedenza più debole di tutte, quindi ^a|b$ significa "inizia con a, oppure finisce con b" — non ciò che la maggior parte delle persone intende quando lo scrive.

Classi di caratteri

11

Le abbreviazioni sono solo ASCII a meno che non aggiungi il flag u e usi gli escape di proprietà Unicode.

SintassiSignificatoEsempio
.Qualsiasi carattere tranne un'interruzione di rigaAggiungi il flag s per fargli corrispondere anche i newline./a.c/"abc" "abc"
\dUna cifra, 0–9/\d+/"order 42" "42"
\DQualsiasi cosa che non sia una cifra/\D+/"42abc" "abc"
\wLettera, cifra o trattino bassoSolo ASCII — "é" non è \w./\w+/"user_1!" "user_1"
\WQualsiasi cosa a cui \w non corrisponde/\W+/"a++b" "++"
\sQualsiasi spazio bianco, comprese tabulazioni e newline/\s+/"a \t b" " \t "
\SQualsiasi carattere non di spaziatura/\S+/" hi" "hi"
[abc]Uno qualsiasi dei caratteri elencati/[aeiou]/"rhythm and" "a"
[^abc]Qualsiasi carattere tranne quelli elencati/[^aeiou ]+/"aeiou xyz" "xyz"
[a-z]Un intervallo di caratteri/[a-f]+/"zzabcz" "abc"
\p{L}Qualsiasi lettera Unicode (richiede il flag u)/\p{L}+/"42 café" "café"

Quantificatori

7

Tutti questi sono greedy per impostazione predefinita: prendono quanto più possono e restituiscono solo se il resto del pattern fallisce.

SintassiSignificatoEsempio
*Zero o più/ab*/"a" "a"
+Uno o più/ab+/"abbb" "abbb"
?Zero o uno — lo rende facoltativo/colou?r/"color" "color"
{3}Esattamente tre/\d{3}/"id 12345" "123"
{2,}Due o più/a{2,}/"aaa" "aaa"
{2,4}Tra due e quattro/a{2,4}/"aaaaa" "aaaa"
*?Lazy — prende quanto meno possibileIl greedy <.+> ingoierebbe entrambi i tag./<.+?>/"<a><b>" "<a>"

Ancoraggi e confini

4

Questi corrispondono a una posizione, non a un carattere, quindi non consumano nulla.

SintassiSignificatoEsempio
^Inizio della stringa, o di una riga con il flag m/^a/"abc" "a"
$Fine della stringa, o di una riga con il flag m/c$/"abc" "c"
\bUn confine di parolaÈ questo che impedisce a "cat" di corrispondere dentro "concatenate"./\bcat\b/"the cat sat" "cat"
\BNon un confine di parola/\Bcat/"concatenate" "cat"

Gruppi e alternanza

5
SintassiSignificatoEsempio
(abc)Gruppo catturante — memorizzato per la sostituzione/(\d+)-(\d+)/"10-20" "10-20"
(?:abc)Raggruppamento senza catturaUsalo quando serve solo il raggruppamento; mantiene significativi i numeri delle catture./(?:ab)+/"abab" "abab"
(?<name>…)Gruppo catturante denominato/(?<year>\d{4})/"in 2026" "2026"
a|bL'uno o l'altro lato — alternanzaL'alternanza ha la precedenza più bassa: ^a|b$ è "^a" oppure "b$", non "^(a|b)$"./cat|dog/"one dog" "dog"
\1Backreference al primo gruppo/(\w)\1/"letter" "tt"

Lookaround

4

Asserzioni su ciò che circonda una posizione. Non corrispondono a nulla di per sé, ed è ciò che le rende sicure da combinare.

SintassiSignificatoEsempio
(?=…)Lookahead — seguito da questo/\d+(?= kg)/"80 kg" "80"
(?!…)Lookahead negativo — non seguito da questo/\d+(?! kg)/"80 lb" "80"
(?<=…)Lookbehind — preceduto da questo/(?<=\$)\d+/"costs $40" "40"
(?<!…)Lookbehind negativo — non preceduto da questo/(?<!\$)\b\d+/"about 40" "40"

Escape

5

Questi dodici caratteri sono quelli che richiedono una barra rovesciata per essere presi alla lettera.

SintassiSignificatoEsempio
\.Un punto letterale/\d\.\d/"v2.5" "2.5"
\\Una barra rovesciata letterale/\\/"C:\\dir" "\\"
\nUn avanzamento riga/a\nb/"a\nb" "a\nb"
\tUna tabulazione/a\tb/"a\tb" "a\tb"
\uFFFFUn carattere tramite il suo punto di codice/\u00e9/"café" "é"

Flag

6
FlagNomeSignificato
gGlobalTrova ogni corrispondenza, non solo la prima.
iIgnora maiuscole/minuscoleCorrisponde indipendentemente da maiuscole o minuscole.
mMultilineFa corrispondere ^ e $ a ogni interruzione di riga invece che solo alle estremità della stringa.
sDot allConsente a . di corrispondere anche alle interruzioni di riga.
uUnicodeTratta il pattern come punti di codice e abilita gli escape di proprietà \p{…}.
yStickyCorrisponde solo esattamente a lastIndex, senza mai cercare in avanti.

FAQ

Qual è la differenza tra quantificatori greedy e lazy?
I quantificatori greedy (*, +, {2,}) corrispondono a quanto più possibile e restituiscono i caratteri solo quando il resto del pattern non può corrispondere. Aggiungere ? li rende lazy: corrispondono a quanto meno possibile e prendono di più solo se forzati. Su "<a><b>", il pattern <.+> restituisce l'intera stringa e <.+?> restituisce solo <a>.
Perché la mia parola corrisponde all'interno di altre parole?
Perché nulla l'ha ancorata. Racchiudi la parola tra \b — /\bcat\b/ trova "cat" in "the cat sat" ma non dentro "concatenate". \b corrisponde a una posizione tra un carattere di parola e uno che non lo è, quindi non consuma nulla.
Cosa cambia il flag u?
Fa operare il pattern sui punti di codice anziché sulle unità UTF-16, così una singola emoji conta come un carattere, e abilita gli escape di proprietà \p{…} come \p{L} per "qualsiasi lettera". Senza di esso, \w e \d restano solo ASCII, ed è per questo che "café" non corrisponde completamente a /\w+/.
Quando conviene usare un gruppo non catturante?
Ogni volta che serve il raggruppamento ma non il testo catturato — (?:ab)+ invece di (ab)+. Le catture costano un po' di prestazioni, ma il vero motivo è la numerazione: ogni gruppo catturante che aggiungi sposta i numeri di quelli successivi, rompendo silenziosamente le sostituzioni che usano $1 e $2.
È sicuro usare il lookbehind?
Nei browser attuali e in Node, sì — (?<=…) e (?<!…) sono supportati da ogni motore principale dal 2018. Safari è stato l'ultimo ad aggiungerlo. Se punti a runtime molto vecchi, verifica prima; non esiste un polyfill per la sintassi delle regex.