Vai al contenuto
eLearner.app
Modulo 2 · Lezione 3 di 47/32 nel corso~10 min
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.

Code
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

Esercizio#regex.m2.l3.e1
Tentativi: 0Caricamento…

Estrai ogni tag HTML del sample (es. `<b>`, `</b>`, `<i>`, `</i>`) usando la versione lazy `.*?`.

Caricamento editor…
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

Esercizio#regex.m2.l3.e2
Tentativi: 0Caricamento…

Estrai ogni stringa tra apici doppi nel testo (es. "ciao", "mondo"). Usa la versione lazy del quantificatore per non saltare a chiusure successive.

Caricamento editor…
Mostra suggerimento

".*?" si ferma al primo apice doppio di chiusura.

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#regex.m2.l3.e3
Tentativi: 0Caricamento…

Estrai tutti i blocchi di testo racchiusi tra parentesi quadre (es. `[testo]`), comprese le parentesi, usando un quantificatore pigro per non unire blocchi separati.

Caricamento editor…
Mostra suggerimento

Usa \[ per la quadra aperta, poi .*? e infine \] per la quadra chiusa.

Soluzione disponibile dopo 3 tentativi