Espressioni regolari in pratica

Un'espressione regolare descrive un insieme di stringhe: \d{4}-\d{2}-\d{2} riconosce le date scritte come 2025-03-14, [A-Z]{6}\d{2} l'inizio di un codice fiscale. Le parentesi tonde creano gruppi di cattura, che si possono riusare nella sostituzione con $1, $2 o per nome, se il gruppo ne ha uno.

I flag cambiano il comportamento: g cerca tutte le corrispondenze invece della prima, i ignora maiuscole e minuscole, m fa valere ^ e $ a ogni riga, s fa corrispondere il punto anche all'a capo, u abilita le classi Unicode come \p{L}. Senza g, la sostituzione cambia solo la prima occorrenza.

Alcuni pattern, come (a+)+$ o (\w+\s?)*$, su un testo che quasi corrisponde provano un numero esponenziale di combinazioni e possono bloccare un browser o un server: è il ReDoS. Qui il test gira in un processo separato e viene interrotto dopo un secondo, così la pagina resta usabile e ti avvisa del problema.

Errori frequenti

  • Dimenticare di raddoppiare le barre rovesciate quando la regex va dentro una stringa nel codice: qui si scrive \d, in una stringa JavaScript "\\d".
  • Usare .* dove serve .*?: il quantificatore avido prende tutto fino all'ultima occorrenza possibile.
  • Annidare quantificatori come (a+)+ o (a|a)*: sono la causa più comune di backtracking catastrofico.

Domande frequenti

Che motore di espressioni regolari usa?

Quello JavaScript (ECMAScript) del tuo browser. È molto simile a PCRE, usato da PHP, ma alcune funzioni, come i gruppi atomici e i quantificatori possessivi, mancano.

Come uso un gruppo nella sostituzione?

Con $1, $2… per i gruppi numerati, $ seguito dal nome fra parentesi angolari per quelli con nome e $& per l'intera corrispondenza. Per scrivere un dollaro letterale si usa $$.

Il testo che inserisco viene inviato da qualche parte?

No: tutto avviene nel browser. Pattern e testo finiscono solo nell'indirizzo della pagina, per poterla condividere, e solo se sono brevi.

Come funziona questo calcolo

Il pattern viene compilato con new RegExp(pattern, flag) e applicato con String.prototype.matchAll, sempre con il flag g aggiunto per scorrere il testo; senza g nella richiesta si tiene solo la prima corrispondenza. La sostituzione usa String.prototype.replace con i flag scelti. L'esecuzione avviene in un Web Worker, che viene terminato se non risponde entro 1 secondo; al massimo si elencano 1000 corrispondenze.