Vai al contenuto
eLearner.app

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 stringa

    Le 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 whitespace
  • Classi 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 letterale
  • Unicode (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 2
  • Greedy vs lazy

    .+       greedy: il piu' possibile
    .+?      lazy: il meno possibile
    .*?      lazy zero-or-more
    a{2,5}?  versione lazy

    Lazy 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 indices
  • Combinazioni 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 ripetuto
  • Rifattorizzazioni

    ^(\w+\s+)+$       pericoloso
    ^(?:\w+\s+)*\w+$  sicuro
    .*?,.*?,.*?,       limita backtracking con lazy

    Disgiungi i casi, evita nidificazione, valida lunghezza input.

eLearner.app · Corso Regex · cheatsheet generato dai contenuti delle lezioni.