Guida rapida Regex gratuita

Guida di riferimento interattiva per le espressioni regolari.

Test di pattern in tempo reale

Testa un pattern

Nessuna corrispondenza

Come usare

  1. Sfoglia le categorie di pattern o usa la casella di ricerca per trovare pattern specifici.
  2. Inserisci un'espressione regolare nel campo «Testa un pattern» e del testo di esempio in «Testo di test».
  3. Attiva/disattiva i flag (globale, insensibile a maiuscole/minuscole, multilinea) e visualizza le corrispondenze evidenziate istantaneamente.

Domande frequenti

Cos'è un'espressione regolare?

Un'espressione regolare (regex o regexp) è un pattern usato per trovare, cercare e sostituire del testo. Usa caratteri e una sintassi speciali per definire le stringhe da trovare.

A cosa servono i flag?

Globale (g) trova tutte le corrispondenze. Insensibile alla maiuscole/minuscole (i) ignora la differenza tra maiuscole e minuscole. Multilinea (m) tratta ^ e $ come limiti di riga invece che limiti di stringa.

Posso usare questo cheatsheet nel mio codice?

Sì! Una volta testato un pattern qui e verificato che funziona, copia il pattern regex direttamente nel tuo codice JavaScript, Python o in un altro linguaggio di programmazione.

Breve storia del linguaggio dei pattern

Le espressioni regolari sono nate come un pezzo di informatica teorica. Stephen Kleene definì gli "insiemi regolari" in un articolo del 1956 sulle reti neurali; Ken Thompson le portò in Unix nel 1968 con grep. La libreria regex open source di Henry Spencer (metà degli anni Ottanta) divenne la base di molte implementazioni successive. Larry Wall estese drasticamente la sintassi in Perl, e le sue "Perl-compatible regular expressions" (PCRE) sono diventate lo standard di fatto seguito dalla maggior parte dei linguaggi moderni. Oggi esistono diverse varianti di regex strettamente imparentate ma sottilmente diverse, e un pattern che funziona in un motore non sempre funziona in modo identico in un altro.

Il motore in cui vive il tuo pattern

La stessa sintassi può significare cose diverse in motori diversi. Le grandi famiglie:

Il tester interattivo di questo cheatsheet gira in JavaScript, quindi il pattern è valutato dal motore JS del browser. Pattern che funzionano qui possono comportarsi diversamente in Python o PHP. La maggior parte delle differenze riguarda funzionalità avanzate (lookbehind, escape di proprietà Unicode, backreference) piuttosto che la sintassi di base.

I mattoni fondamentali

Quasi ogni pattern regex è costruito a partire da questi elementi:

Pattern che vale la pena memorizzare

Alcuni pattern compaiono così spesso che vale la pena tenerli a mente:

UsoPattern
Email (base)^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
URLhttps?://[^\s]+
Numero di telefono statunitense\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Data ISO (AAAA-MM-GG)\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
Indirizzo IPv4 (senza validazione degli ottetti)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
Colore esadecimale^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
Spazi all'inizio o alla fine di una riga^\s+|\s+$
Più spazi consecutivi\s{2,}

Una nota sulla regex per email: la validazione completa secondo RFC 5322 richiede una regex mostruosa di 6.000 caratteri. La forma semplice qui sopra accetta il 99% degli indirizzi reali e non rifiuta nulla di legittimo; in produzione, invia un'email di conferma invece di cercare di validare perfettamente la sintassi.

Greedy contro lazy: una sorpresa frequente

Per impostazione predefinita, i quantificatori sono greedy: corrispondono al massimo possibile pur consentendo al pattern complessivo di corrispondere. Quindi <.+> applicato a <a>text</a> corrisponde all'intera stringa, non solo a <a>, perché .+ afferra quanto più può. Per corrispondere alla stringa più piccola possibile, aggiungi ? al quantificatore: <.+?> corrisponde a <a> e poi a </a> separatamente. La scelta greedy/lazy è una delle cause più comuni di bug del tipo "perché la mia regex non corrisponde a quello che mi aspettavo".

Backtracking catastrofico e ReDoS

Alcuni pattern regex possono richiedere tempo esponenziale per fallire su certi input, una classe di vulnerabilità denial-of-service chiamata ReDoS (Regular Expression Denial of Service). I colpevoli classici sono quantificatori annidati come (a+)+ oppure (a|aa)+ applicati a una lunga stringa di a seguita da un carattere non corrispondente. Il motore prova ogni modo possibile di dividere la stringa prima di arrendersi, e il numero di modi è esponenziale.

Incidenti reali: il blackout di Cloudflare del 2019 fu causato da una regex usata in una regola WAF che subì un backtracking catastrofico su certi input. Stack Overflow ebbe un incidente simile nel luglio 2016: una regex di trim (^[\s‌]+|[\s‌]+$) incappò in backtracking esponenziale su un singolo commento contenente circa 20.000 caratteri di spaziatura consecutivi e mise offline il sito per 34 minuti. Abitudini difensive: evita i quantificatori annidati, preferisci i gruppi atomici ((?>...)) dove sono supportati e considera l'uso di RE2 o motori a tempo lineare per input non fidati.

Stranezze per linguaggio che vale la pena conoscere

Quando NON usare le regex

La famosa frase di Jamie Zawinski del 1997: "Alcuni, di fronte a un problema, pensano: 'lo so, userò le espressioni regolari'. Ora hanno due problemi."

Errori comuni

  1. Dimenticare di fare l'escape dei caratteri speciali. ., *, ?, +, (, ), [, ], {, }, \, ^, $, |, / hanno tutti significati speciali. Per cercarli letteralmente, fai precedere il backslash.
  2. Quantificatori greedy che consumano troppo. Aggiungi ? per il matching lazy quando vuoi la corrispondenza più piccola possibile.
  3. Dimenticare il flag global e chiedersi perché compare solo la prima corrispondenza. String.prototype.match() di JavaScript restituisce solo la prima corrispondenza senza il flag g.
  4. Backtracking catastrofico su input lunghi. Quantificatori annidati come (a+)+ possono bloccarsi su certi input. Testa con casi limite.
  5. Dare per scontato che la stessa regex si comporti allo stesso modo in ogni linguaggio. Lookbehind, escape Unicode e abbreviazioni delle classi di caratteri variano tutti.
  6. Validare le email in modo troppo rigoroso. La regex tecnicamente corretta secondo RFC 5322 è impossibile da mantenere; una regex semplice più email di conferma alla registrazione è il pattern che funziona.
  7. Usare regex su HTML, JSON o CSV. Usa un parser dedicato; il tempo che risparmi all'inizio lo perdi in bug.

Altre domande frequenti

Perché il mio pattern funziona qui ma fallisce nel mio codice?

La causa più comune sono le differenze tra motori. RegExp di JavaScript non supporta alcune funzionalità di PCRE (e viceversa). Trappole comuni: i lookbehind sono stati aggiunti tardi a JS (ES2018), la sintassi dei gruppi con nome differisce leggermente, gli escape di proprietà Unicode richiedono il flag u e le classi POSIX come [[:alpha:]] sono per lo più assenti da JS. Testa nel motore di destinazione.

Esiste un modo "globale" per cercare attraverso più righe?

Due flag lavorano insieme. Il flag m (multilinea) fa sì che ^ e $ corrispondano all'inizio e alla fine di ogni riga anziché dell'intera stringa. Il flag s (dotall) fa sì che . corrisponda anche ai newline. Combinati con g per il globale, puoi scrivere pattern che attraversano più righe e trovano ogni corrispondenza: /^foo.+$/gms.

I miei pattern e il testo di prova vengono inviati da qualche parte?

No. Il matching del pattern usa il motore RegExp JavaScript integrato nel browser; nulla viene caricato su nessun server. Questo è importante quando testi pattern su dati di log di produzione reali, risposte di API interne o contenuti sensibili.

Dovrei imparare i lookbehind?

Utili ma non essenziali. I lookbehind ti permettono di trovare testo preceduto da qualcosa senza includere quel qualcosa nella corrispondenza. Esempio: (?<=\$)\d+ corrisponde alle cifre dopo un simbolo del dollaro senza consumare il dollaro. Sono supportati in PCRE, nel JavaScript moderno (ES2018+) e nel modulo regex di Python. Se scrivi pattern portabili, controlla prima il motore di destinazione.

Perché usare (?:...) invece di (...)?

I gruppi non di cattura ((?:...)) sono leggermente più veloci, non occupano uno slot nell'array delle catture e mantengono i risultati puliti. Usali quando hai bisogno di raggruppare per alternanza o quantificazione ma non devi estrarre il testo trovato. (http|https):// crea una cattura di cui forse non hai bisogno; (?:http|https):// no.

Qual è il modo corretto di cercare caratteri Unicode?

In JavaScript, aggiungi il flag u e usa gli escape delle proprietà Unicode: /\p{Letter}+/gu corrisponde a sequenze di lettere in qualsiasi alfabeto. Senza il flag u, \w corrisponde solo ai caratteri ASCII di parola. Il modulo re di Python è consapevole di Unicode per impostazione predefinita in Python 3. Java richiede Pattern.UNICODE_CHARACTER_CLASS. La maggior parte dei motori ha un modo per essere consapevole di Unicode; controlla la documentazione del tuo.

Strumenti correlati

Formattatore e validatore JSON gratuito online Codificatore / Decodificatore URL gratuito Convertitore maiuscole/minuscole