Salt la conținutul principal
Modulul 2 · Lecția 3 din 47/32 în curs~10 min
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.

Code
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ă

Exercițiu#regex.m2.l3.e1
Încercări: 0Se încarcă…

Extrageți fiecare etichetă HTML din eșantion (de exemplu, `<b>`, `</b>`, `<i>`, `</i>`) folosind versiunea leneșă `.*?`.

Se încarcă editorul...
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

Exercițiu#regex.m2.l3.e2
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
Afișează indiciu

".*?" se oprește la prima ghilimă dublă de închidere.

Soluție disponibilă după 3 încercări

Provocare suplimentară

Exercițiu#regex.m2.l3.e3
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
Afișează indiciu

Folosiți \\[ pentru paranteza deschisă, apoi .*? și în final \\] pentru paranteza închisă.

Soluție disponibilă după 3 încercări