Lecții din modul (3/4)
Lacom vs leneș
În mod implicit, cuantificatorii sunt lacomi: consumă cât mai mult posibil
păstrând în același timp modelul valabil. Adăugarea ? după un cuantificator (*?, +?,
??, {n,m}?) vă oferă versiunea leneș: consumă cât de puțin
posibil.
Sample: <b>uno</b> e <i>due</i>
Greedy pattern <.*> matches: <b>uno</b> e <i>due</i> (everything)
Lazy pattern <.*?> matches: <b> </b>
<i> </i> (4 matches with the g flag)Exact același model, un singur caracter de diferență (? adăugat la
cuantificator), rezultate total diferite.
Când contează
- Pentru a extrage conținutul dintre delimitatori (etichete HTML, ghilimele, paranteze) versiunea leneș este aproape întotdeauna cea potrivită.
- Pentru a se potrivi până la sfârșitul rândului, de obicei doriți lacomi (
.*).
Strategii Greedy vs Lazy în motor
Un cuantificator lacom consumă cât mai mult text posibil și dă înapoi numai dacă este forțat. Adăugând ? (lazy), motorul consumă minimul absolut și avansează câte un caracter, căutând următoarea potrivire a modelului.
Încearcă
Extrageți fiecare etichetă HTML din eșantion (de exemplu, `<b>`, `</b>`, `<i>`, `</i>`) folosind versiunea leneșă `.*?`.
Afișează indiciu
Greedy <.*> se potrivește de la începutul primei etichete până la sfârșitul ultimei. Lazy <.*?> se oprește la primul > pe care îl întâlnește.
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Extrageți fiecare șir între ghilimele duble din text (de exemplu, „ciao”, „mondo”). Utilizați versiunea leneșă a cuantificatorului pentru a evita săriți la închideri ulterioare.
Afișează indiciu
".*?" se oprește la prima ghilimă dublă de închidere.
Soluție disponibilă după 3 încercări
Provocare suplimentară
Extract all text blocks enclosed in square brackets (e.g. `[text]`), including the brackets, using a lazy quantifier so as not to merge separate blocks.
Afișează indiciu
Folosiți \\[ pentru paranteza deschisă, apoi .*? și în final \\] pentru paranteza închisă.
Soluție disponibilă după 3 încercări