Corso Regex
Cheatsheet
Un riferimento veloce — la sintassi essenziale di regex JavaScript moderno su una pagina sola. Usa Ctrl/Cmd + P per stamparla.
Regex · Cheatsheet — eLearner.app
Sintassi di base
Pattern letterali
/ciao/ // matcha "ciao" /Ciao/i // case-insensitive /^abc/ // ancorato a inizio stringaLe slash delimitano il pattern; le lettere matchano se stesse.
Meta-caratteri
. ^ $ * + ? ( ) [ ] { } | \Per matcharli letteralmente escapali con \.
Il jolly .
/a.c/ // a + qualunque + c /a.c/s // . include anche \n (flag s)
Classi predefinite
Classi di carattere
\d cifra [0-9] \D non cifra \w parola [A-Za-z0-9_] \W non parola \s whitespace \S non whitespaceClassi custom
[abc] uno tra a, b, c [a-z] range a..z [A-Za-z0-9_] come \w [^abc] NEGATA: tutto tranne a,b,c [.,;:] punteggiatura letteraleUnicode (con flag u)
\p{L} qualunque Lettera \p{N} Numero \p{S} Simbolo \p{Script=Latin} alfabeto latino \P{L} non-lettera
Quantificatori
Base
a* 0 o piu' a a+ 1 o piu' a a? 0 o 1 a (opzionale) a{3} esattamente 3 a{2,5} da 2 a 5 a{2,} almeno 2Greedy vs lazy
.+ greedy: il piu' possibile .+? lazy: il meno possibile .*? lazy zero-or-more a{2,5}? versione lazyLazy aggiunge ? dopo il quantificatore.
Ancore
Confini
^ inizio stringa (o riga con flag m) $ fine stringa (o riga con flag m) \b confine di parola \B NON confine di parola \A \z inizio/fine assoluti (non in JS)Esempi
/^abc/ stringa che inizia con abc /abc$/ stringa che finisce con abc /\bword\b/ parola intera /^\s*$/m riga vuota (con flag m)
Gruppi e alternative
Gruppi
(abc) cattura, accessibile come $1 (?:abc) non-cattura (?<nome>abc) named: groups.nome / $<nome> a|b|c alternative (a oppure b oppure c)Backreferences
(\w+)\s+\1 parola duplicata consecutiva (?<a>\w)\k<a> backref nominato String.replace(/(\w+) (\w+)/, '$2 $1')
Lookaround (larghezza zero)
Lookahead
(?=...) positivo: deve seguire ... (?!...) negativo: NON deve seguire ... \d+(?= euro) cifre solo se seguite da " euro"Lookbehind (ES2018+)
(?<=...) positivo: deve precedere ... (?<!...) negativo: NON deve precedere ... (?<=\$)\d+ cifre solo se precedute da $
Flag (ordine canonico: dgimsuvy)
Le 8 flag
g global (tutti i match) i ignore case m multiline (^ e $ per riga) s dot all (. matcha \n) u Unicode (abilita \p{...}) v Unicode v-mode (set operations) y sticky (solo da lastIndex) d has indicesCombinazioni tipiche
gi "trova tutto, no case" gm righe in testo multilinea gs blocchi su piu' righe gu testi reali con accenti / emoji
Replace e split
replace base
'foo bar'.replace(/o/g, '0') // 'f00 bar' 'Mario Rossi'.replace(/(\w+) (\w+)/, '$2 $1') // '2024-03-15' -> '15/03/2024' data.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1');replace con callback
str.replace(/\d+/g, (m) => Number(m) * 2); str.replace(/(\d{4})-(\d{2})/, (_, a, m) => `$\{m\}/$\{a\}`);La callback riceve match, gruppi, offset, original, groups.
split con regex
'a, b ,c, d'.split(/\s*,\s*/) // ['a','b','c','d'] 'a=1; b=2'.split(/\s*;\s*/) // ['a=1', 'b=2']Riferimenti in replace
$1 $2 ... gruppo numerato $<nome> gruppo nominato $& intero match $` testo prima del match $' testo dopo il match $$ un $ letterale
Pattern utili
Email (abbastanza buono)
/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/Per validare davvero: invia mail di conferma.
IPv4 permissivo
/\b(?:\d{1,3}\.){3}\d{1,3}\b/URL http(s)
/https?:\/\/[\w.-]+(?::\d+)?(?:\/[^\s]*)?/Numero decimale
/-?\d+(?:\.\d+)?/Trim whitespace
s.replace(/^\s+|\s+$/g, '')
Anti ReDoS
Pattern catastrofici
(a+)+b NIDIFICATO -> esplode (a|a)* ALTERNATIVE sovrapposte (\w+\s+)+ gruppo greedy ripetutoRifattorizzazioni
^(\w+\s+)+$ pericoloso ^(?:\w+\s+)*\w+$ sicuro .*?,.*?,.*?, limita backtracking con lazyDisgiungi i casi, evita nidificazione, valida lunghezza input.