I quantificatori greedy e lazy
Quando si utilizzano i quantificatori nelle espressioni regolari, bisogna ricordarsi che ne esistono due versioni: greedy e lazy ( o non greedy ).
Quantificatore greedy
Il quantificatore greedy trova la corrispondenza con il maggior numero di occorrenze.
Generalmente, nella regex tutti i quantificatori sono greedy di default.mente, tutti i quantificatori sono greedy di default.
- *
- +
- ?
- {n,m}
Un esempio pratico
Nel seguente esempio provo a selezionare i tag html del documento tramite l'espressione <.+>
Tuttavia, la regex in versione "greedy" seleziona tutto ciò che trova tra il primo tag di apertura e l'ultimo tag di chiusura >.
Nota. Non a caso la traduzione letterale di greedy è avido o ingordo.
Quantificatore lazy
Il quantificatore lazy ( o non greedy ) seleziona la corrispondenza con il minore numero di occorrenze possibili.
In un'espressione regolare per utilizzare i quantificatori nella versione lazy si aggiunge il simbolo del punto interrogativo dopo il quantificatore.
- *?
- +?
- ??
- {n,m}?
Esempio
Provo a selezionare i tag html del documento rendendo pigro il quantificatore jolly <.?>
In questo caso, la regex in versione "lazy" ha selezionato diverse occorrenze del testo, più piccole della precedente.
Nota. La traduzione letterale di lazy è pigro.
La differenza tra greedy e lazy
Il più delle volte i quantificatori greedy e lazy estraggono le stesse corrispondenze.
Tuttavia, nel caso del quantificatore jolly (.) diventa molto più marcata e importante.
Nel quantificatore greedy ( avida ) la ricerca del simbolo di chiusura delle occorrenze avviene all'indietro a partire dalla fine tramite un processo di backtracking.
Viceversa, nel quantificatore lazy ( pigro ) la ricerca avviene in avanti tramite un processo di forward tracking.