Lezioni del modulo (3/4)
Greedy vs lazy
Per default i quantificatori sono greedy (avidi): consumano il massimo
possibile mantenendo il pattern valido. Aggiungendo ? dopo un
quantificatore (*?, +?, ??, {n,m}?) ottieni la versione lazy
(pigra): consuma il minimo possibile.
Sample: <b>uno</b> e <i>due</i>
Pattern greedy <.*> matcha: <b>uno</b> e <i>due</i> (tutto)
Pattern lazy <.*?> matcha: <b> </b>
<i> </i> (4 match con flag g)Stesso identico pattern, una sola lettera di differenza (? aggiunto al
quantificatore), risultati totalmente diversi.
Quando importa
- Per estrarre il contenuto fra delimitatori (HTML tag, virgolette, parentesi) la versione lazy e' quasi sempre quella giusta.
- Per matchare fino a fine riga di solito vuoi greedy (
.*).
Strategie Greedy vs Lazy nell'engine
Un quantificatore avido (greedy) consuma tutto il testo possibile e torna indietro solo se costretto. Aggiungendo ? (lazy), l'engine consuma il minimo indispensabile e avanza un carattere alla volta cercando la corrispondenza successiva del pattern.
Prova tu
Estrai ogni tag HTML del sample (es. `<b>`, `</b>`, `<i>`, `</i>`) usando la versione lazy `.*?`.
Mostra suggerimento
Greedy <.*> matcha dall'inizio del primo tag fino alla fine dell'ultimo. Lazy <.*?> si ferma al primo > che incontra.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Estrai ogni stringa tra apici doppi nel testo (es. "ciao", "mondo"). Usa la versione lazy del quantificatore per non saltare a chiusure successive.
Mostra suggerimento
".*?" si ferma al primo apice doppio di chiusura.
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
Estrai tutti i blocchi di testo racchiusi tra parentesi quadre (es. `[testo]`), comprese le parentesi, usando un quantificatore pigro per non unire blocchi separati.
Mostra suggerimento
Usa \[ per la quadra aperta, poi .*? e infine \] per la quadra chiusa.
Soluzione disponibile dopo 3 tentativi