Vai al contenuto
TextArray

Cheatsheet di Regex

Le espressioni regolari sono abbastanza compatte da rendere la sintassi più facile da cercare che da memorizzare. Questa pagina è tutto su un'unica schermata: classi, quantificatori, ancore, gruppi, lookaround, escape e flag - con un esempio funzionante per ogni riga.

Il sapore è JavaScript, che è ciò che viene eseguito nel tuo browser e ciò che utilizza il tester regex su questo sito. La maggior parte è identica in Python, Java, Go e PCRE; dove i sapori divergono, divergono sui bordi: supporto lookbehind, sintassi del gruppo con nome e se \d significa "cifra ASCII" o "qualsiasi cifra Unicode".

Due cose spiegano la maggior parte delle sorprese. I quantificatori sono avidi: prendono tutto ciò che possono e lo restituiscono solo quando il resto del pattern fallisce, motivo per cui <.+> inghiotte due tag e <.+?> no. E l'alternanza è quella più libera di tutte, quindi ^a|b$ significa "inizia con a o finisce con b" - non ciò che la maggior parte delle persone intende quando lo scrive.

Classi di caratteri

Le abbreviazioni sono solo ASCII a meno che non si aggiunga il flag u e si utilizzino gli escape della proprietà Unicode.

SintassiSensoEsempio
.Qualsiasi carattere tranne un'interruzione di rigaAggiungi il flag s per farlo corrispondere anche alle nuove righe./a.c/"abc" → "abc"
\dUna cifra, 0–9/\d+/"order 42" → "42"
\DTutto ciò che non è una cifra/\D+/"42abc" → "abc"
\wLettera, cifra o carattere di sottolineaturaSolo ASCII — "é" non è \w./\w+/"user_1!" → "user_1"
\WQualsiasi cosa \w non corrisponde/\W+/"a++b" → "++"
\sQualsiasi spazio bianco, incluse tabulazioni e ritorni a capo/\s+/"a \t b" → " \t "
\SQualsiasi carattere diverso da uno spazio bianco/\S+/" hi" → "hi"
[abc]Uno qualsiasi dei personaggi elencati/[aeiou]/"rhythm and" → "a"
[^abc]Qualsiasi carattere tranne quelli elencati/[^aeiou ]+/"aeiou xyz" → "xyz"
[a-z]Una gamma di personaggi/[a-f]+/"zzabcz" → "abc"
\p{L}Qualsiasi lettera Unicode (è necessario il flag u)/\p{L}+/"42 café" → "café"

Quantificatori

Tutti questi sono avidi per impostazione predefinita: prendono tutto ciò che possono e restituiscono solo se il resto del modello fallisce.

SintassiSensoEsempio
*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 le due e le quattro/a{2,4}/"aaaaa" → "aaaa"
*?Pigro: impiega il meno possibileL'avido <.+> ingoierebbe entrambi i tag./<.+?>/"<a><b>" → "<a>"

Ancore e confini

Corrispondono a una posizione, non a un personaggio, quindi non consumano nulla.

SintassiSensoEsempio
^Inizio della stringa, o di una linea con il flag m/^a/"abc" → "a"
$Fine della stringa o di una riga con il flag m/c$/"abc" → "c"
\bUn confine di paroleQuesto è ciò che impedisce la corrispondenza di "cat" all'interno di "concatenate"./\bcat\b/"the cat sat" → "cat"
\BNon una parola di confine/\Bcat/"concatenate" → "cat"

Gruppi e alternanza

SintassiSensoEsempio
(abc)Gruppo di cattura: ricordato per la sostituzione/(\d+)-(\d+)/"10-20" → "10-20"
(?:abc)Raggruppare senza catturareUsalo quando hai bisogno solo del raggruppamento; mantiene significativi i numeri di acquisizione./(?:ab)+/"abab" → "abab"
(?<name>…)Gruppo di acquisizione denominato/(?<year>\d{4})/"in 2026" → "2026"
a|bEntrambi i lati: alternanzaL'alternanza ha la precedenza più bassa: ^a|b$ è "^a" o "b$", non "^(a|b)$"./cat|dog/"one dog" → "dog"
\1Ritorno al primo gruppo/(\w)\1/"letter" → "tt"

Guardatevi intorno

Asserzioni su ciò che circonda una posizione. Non corrispondono a nulla da soli, il che è ciò che li rende sicuri da combinare.

SintassiSensoEsempio
(?=…)Lookahead - seguito da questo/\d+(?= kg)/"80 kg" → "80"
(?!…)Lookahead negativo: non seguito da questo/\d+(?! kg)/"80 lb" → "80"
(?<=…)Guarda dietro – preceduto da questo/(?<=\$)\d+/"costs $40" → "40"
(?<!…)Lookbehind negativo – non preceduto da questo/(?<!\$)\b\d+/"about 40" → "40"

In fuga

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

SintassiSensoEsempio
\.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 scheda/a\tb/"a\tb" → "a\tb"
\uFFFFUn carattere in base al relativo punto di codice/\u00e9/"café" → "é"

Bandiere

BandieraNomeSenso
gGlobaleTrova ogni corrispondenza, non solo la prima.
iIgnora maiuscole e minuscoleCorrisponde indipendentemente dal carattere maiuscolo o minuscolo.
mMultilineaFa sì che ^ e $ corrispondano ad ogni interruzione di riga anziché solo alla fine della stringa.
sPunto tuttoLasciamo. anche le interruzioni della linea di corrispondenza.
uUnicodeTratta il modello come punti di codice e abilita gli escape della proprietà \p{…}.
yAppiccicosoCorrisponde solo esattamente all'ultimo indice, senza mai cercare in avanti.

FAQ

Qual è la differenza tra quantificatori avidi e pigri?
I quantificatori greedy (*, +, {2,}) corrispondono il più possibile e restituiscono i caratteri solo quando il resto dello schema non può corrispondere. Aggiunta? li rende pigri: abbinano il meno possibile e prendono di più solo quando sono costretti. Su "<a><b>", il modello <.+> restituisce l'intera stringa e <.+?> restituisce solo <a>.
Perché la mia parola corrisponde ad altre parole?
Perché niente lo ancorava. Racchiudi la parola in \b — /\bcat\b/ corrisponde a "cat" in "the cat sat" ma non all'interno di "concatenate". \b corrisponde a una posizione tra un carattere di parola e uno non di parola, quindi non consuma nulla.
Cosa cambia la bandiera u?
Fa sì che il pattern funzioni su punti di codice anziché su unità UTF-16, quindi una singola emoji conta come un carattere e abilita gli escape della proprietà \p{…} come \p{L} per "qualsiasi lettera". Senza di esso, \w e \d rimangono solo ASCII, motivo per cui "café" non corrisponde completamente a /\w+/.
Quando dovrei utilizzare un gruppo non di acquisizione?
Ogni volta che hai bisogno del raggruppamento ma non del testo catturato — (?:ab)+ invece di (ab)+. Le acquisizioni costano un po' in termini di prestazioni, ma la vera ragione è la numerazione: ogni gruppo di acquisizione aggiunto sposta i numeri di quelli successivi, interrompendo silenziosamente le sostituzioni che utilizzano $ 1 e $ 2.
Lookbehind è sicuro da usare?
Nei browser attuali e in Node, sì — (?<=…) e (?<!…) sono supportati su tutti i principali motori dal 2018. Safari è stato l'ultimo ad aggiungerlo. Se stai prendendo di mira runtime molto vecchi, controlla prima; non esiste polyfill per la sintassi regex.