Espressioni regolari per esseri umani: Una guida pratica
Le espressioni regolari (regex) hanno un problema di immagine. Sembrano come se qualcuno si fosse addormentato sulla tastiera: ^[\w.-]+@[\w-]+\.[\w.]+$. Appaiono nelle code review, negli editor di testo, negli strumenti di ricerca e nella validazione dei form. Gli sviluppatori o le amano o le evitano del tutto.
La verità sta nel mezzo. Le regex sono genuinamente potenti. Sono anche genuinamente confuse all'inizio. Ma non serve padroneggiare ogni funzionalità oscura per ottenere un valore pratico. Una manciata di pattern copre la stragrande maggioranza dei casi d'uso reali.
Cosa fanno effettivamente le regex
Un'espressione regolare è un pattern che descrive un insieme di stringhe. Lo dai a uno strumento di ricerca, e questo trova ogni stringa che corrisponde al pattern. Pensalo come una query di ricerca molto precisa.
Ricerca normale: trova esattamente "ciao" Ricerca regex: trova qualsiasi cosa che assomigli a un indirizzo email, un numero di telefono, una data, un URL, o qualsiasi altro pattern che puoi descrivere.
Lo sapevi? Le espressioni regolari sono state inventate dal matematico Stephen Kleene nel 1956 come notazione per descrivere i "linguaggi regolari" nella teoria dei linguaggi formali. Sono entrate nell'informatica attraverso i primi editor di testo Unix negli anni '60 e '70.
I mattoni fondamentali
Caratteri letterali
La regex più semplice è solo testo letterale. Il pattern hello corrisponde alla stringa "hello." Niente di complicato.
Il punto (.) — Qualsiasi singolo carattere
Un punto corrisponde a qualsiasi singolo carattere (eccetto un a capo).
h.tcorrisponde a "hat," "hit," "hot," "hut," e persino "h3t"
Classi di caratteri ([]) — Caratteri specifici
Le parentesi quadre definiscono un insieme di caratteri consentiti in quella posizione.
[aeiou]corrisponde a qualsiasi singola vocale[0-9]corrisponde a qualsiasi cifra[A-Za-z]corrisponde a qualsiasi lettera (maiuscola o minuscola)[^0-9]corrisponde a qualsiasi carattere che NON sia una cifra (il^dentro le parentesi significa "non")
Quantificatori — Quanti
Questi simboli controllano la ripetizione:
| Simbolo | Significato | Esempio | Corrisponde a |
|---|---|---|---|
* |
Zero o più | ab*c |
"ac," "abc," "abbc," "abbbc" |
+ |
Uno o più | ab+c |
"abc," "abbc," "abbbc" (non "ac") |
? |
Zero o uno | colou?r |
"color" e "colour" |
{3} |
Esattamente 3 | a{3} |
"aaa" |
{2,4} |
Tra 2 e 4 | a{2,4} |
"aa," "aaa," "aaaa" |
Ancore — Posizione
^all'inizio significa "inizio della stringa"$alla fine significa "fine della stringa"^hello$corrisponde solo all'esatta stringa "hello," non "say hello" o "hello world"
Classi abbreviate
Le classi di caratteri comuni hanno scorciatoie:
| Abbreviazione | Equivalente | Significato |
|---|---|---|
\d |
[0-9] |
Qualsiasi cifra |
\w |
[A-Za-z0-9_] |
Qualsiasi carattere "parola" |
\s |
[ \t\n\r] |
Qualsiasi spazio bianco |
\D |
[^0-9] |
Qualsiasi non-cifra |
\W |
[^A-Za-z0-9_] |
Qualsiasi carattere non-parola |
\S |
[^ \t\n\r] |
Qualsiasi non-spazio bianco |
Gruppi (()) — Raggruppamento e cattura
Le parentesi tonde raggruppano parti di un pattern. Questo è utile per applicare quantificatori a un gruppo o per estrarre parti specifiche di una corrispondenza.
(ab)+corrisponde a "ab," "abab," "ababab"(\d{3})-(\d{4})corrisponde a "555-1234" e cattura "555" e "1234" separatamente
La pipe (|) — O
La pipe significa "o."
cat|dogcorrisponde a "cat" o "dog"(jpg|png|gif)corrisponde a una qualsiasi di queste tre estensioni immagine
Pattern pratici da usare subito
Trovare un indirizzo email (semplice)
[\w.-]+@[\w-]+\.[\w.]+
Analizzandolo:
[\w.-]+— uno o più caratteri parola, punti o trattini (la parte locale)@— simbolo @ letterale[\w-]+— uno o più caratteri parola o trattini (il dominio)\.— punto letterale (con escape perché.è un carattere speciale)[\w.]+— uno o più caratteri parola o punti (il TLD)
Attenzione La validazione delle email con regex è notoriamente difficile da fare perfettamente. Il pattern semplice qui sopra copre il 99% degli indirizzi email reali ma non gestisce ogni caso limite definito nella specifica RFC. Per la validazione in produzione, usa la libreria di validazione email del tuo linguaggio di programmazione.
Trovare un numero di telefono (formato US)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Questo corrisponde a:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
Trovare un URL
https?://[\w.-]+(/[\w./-]*)?
Questo corrisponde a:
Trovare una data (AAAA-MM-GG)
\d{4}-\d{2}-\d{2}
Questo corrisponde a: 2026-03-23, 1999-12-31, ecc.
Trovare parole duplicate
\b(\w+)\s+\1\b
Questo corrisponde a parole ripetute come "the the" o "is is." Il \1 si riferisce a ciò che è stato catturato dal primo gruppo.
Trovare un indirizzo IPv4
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Questo corrisponde a pattern come 192.168.1.1 o 10.0.0.255.
Consigli per scrivere regex
1. Inizia semplice, poi affina
Non cercare di scrivere la regex perfetta al primo tentativo. Inizia con un pattern ampio, testalo sui tuoi dati e restringilo.
2. Testa sempre
È facile sbagliare con le regex. Un quantificatore mancante o un punto senza escape possono cambiare completamente ciò che viene trovato. Testa sempre il tuo pattern con dati reali prima di usarlo in produzione.
3. Usa l'escape per i caratteri speciali
Se devi trovare un punto letterale, una parentesi, una parentesi quadra o un altro carattere speciale, usa l'escape con un backslash: \., \(, \[.
4. Usa commenti e gruppi con nome
Nei pattern complessi, usa gruppi con nome e commenti (dove supportati) per rendere la regex leggibile. Il tuo futuro te stesso ti ringrazierà.
5. Sappi quando non usare le regex
Le regex sono lo strumento sbagliato per analizzare HTML, XML, JSON o qualsiasi struttura annidata. Usa un parser apposito per quelli.
Suggerimento Testa e debugga i tuoi pattern regex in tempo reale: Come testare i pattern regex. Incolla il tuo pattern e i dati di test, e visualizza le corrispondenze evidenziate istantaneamente.
Inizia a testare le regex adesso:
Gratuito, con feedback istantaneo e senza registrazione.