Le espressioni regolari (regex) rappresentano uno degli strumenti più temuti ma, al tempo stesso, più potenti nell'arsenale di un programmatore. Sebbene a prima vista possano sembrare una sequenza caotica di caratteri, una volta compresa la loro logica, diventano essenziali per manipolare testi, validare input utente, estrarre informazioni da log complessi e automatizzare operazioni di ricerca e sostituzione.
I Fondamenti delle Regex
Caratteri Letterali
La maggior parte dei caratteri rappresenta se stessa. Ad esempio, il pattern codice cercherà esattamente la sequenza di lettere "codice" all'interno di una stringa.
Metacaratteri di Controllo
. Qualsiasi carattere (tranne il ritorno a capo) ^ Inizio della riga o stringa $ Fine della riga o stringa \d Qualsiasi cifra numerica (0-9) \w Qualsiasi carattere alfanumerico o underscore (a-z, A-Z, 0-9, _) \s Spazio vuoto (spazi, tabulazioni, nuove righe) \D Qualsiasi carattere NON numerico \W Qualsiasi carattere speciale o non alfanumerico \S Qualsiasi carattere non di spaziatura \b Confine di una parola
Quantificatori
* Zero o più volte
+ Una o più volte
? Zero o una volta (rende l'elemento opzionale)
{3} Esattamente 3 volte
{2,5} Da un minimo di 2 a un massimo di 5 volte
{3,} Almeno 3 volte o più
Classi di Caratteri
Le parentesi quadre permettono di definire un insieme di caratteri consentiti per una specifica posizione.
[aeiou] Match di qualsiasi vocale [a-z] Match di qualsiasi lettera minuscola [A-Za-z] Match di qualsiasi lettera (case-insensitive) [0-9] Match di una cifra (equivalente a \d) [^0-9] Match di qualsiasi cosa che NON sia una cifra [a-zA-Z0-9_] Equivalente a \w
Gruppi e Cattura
// Le parentesi tonde creano gruppi di cattura
const match = "2025-07-08".match(/(\d{4})-(\d{2})-(\d{2})/);
// match[1] = "2025" (anno)
// match[2] = "07" (mese)
// match[3] = "08" (giorno)
// Gruppi nominati (migliorano la leggibilità)
const match2 = "2025-07-08".match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/);
// match2.groups.year = "2025"
// Gruppi non catturanti (per raggruppare senza memorizzare)
/(?:https?|ftp):\/\//
Esempi Pratici di Utilizzo
Validazione Email (Base)
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
emailRegex.test("[email protected]"); // true
emailRegex.test("indirizzo-errato"); // false
Validazione di uno Slug per URL
// Solo caratteri minuscoli, cifre e trattini singoli
const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
slugRegex.test("articolo-di-blog"); // true
slugRegex.test("Articolo Di Blog"); // false
Estrazione di Link da un Testo
const testo = "Visita https://google.com oppure http://sito.org."; const urls = testo.match(/https?:\/\/[^\s]+/g); // ["https://google.com", "http://sito.org"]
Forza Password
// Almeno 8 caratteri, una maiuscola, una minuscola, un numero, un simbolo
const strongPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
Regex in PHP
// Controllo corrispondenza
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $data)) {
echo "Formato data corretto";
}
// Sostituzione (creazione slug)
$slug = preg_replace('/[^a-z0-9]+/', '-', strtolower($titolo));
// Estrazione multipla
preg_match_all('/\b[A-Z][a-z]+\b/', $testo, $risultati);
// $risultati[0] contiene tutte le parole con l'iniziale maiuscola
Errori Comuni da Evitare
- Comportamento Greedy (Avido):
.*cercherà di catturare il più possibile. Usa.*?per una corrispondenza "lazy" (pigra). - Dimenticare l'Escape: Caratteri come
.,*,+o?hanno significati speciali. Se vuoi usarli letteralmente, anteponi sempre una barra rovesciata\. - Mancata ancoratura: Senza
^(inizio) e$(fine), potresti ottenere match parziali indesiderati. - Eccesso di ingegneria: Non usare le regex se metodi nativi come
strpos()oincludes()sono sufficienti e più performanti.
Prova i nostri strumenti per Sviluppatori
Converti, decodifica e formatta il tuo codice in un clic.