Przejdź do głównej treści
eLearner.app
Moduł 2 · Lekcja 3 z 47/32 w kursie~10 min
Lekcje modułu (3/4)

Greedy vs. lazy

Domyślnie kwantyfikatory są chciwe (chciwe): zużywają maksimum możliwe utrzymanie ważności wzoru. Dodając ? po a kwantyfikator (*?, +?, ??, {n,m}?) pobierz wersję leniwą (leniwy): spożywaj jak najmniej.

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)

Dokładnie ten sam wzór, tylko różnica jednej litery (dodano ? kwantyfikator), zupełnie inne wyniki.

Kiedy ma to znaczenie

  • Aby wyodrębnić treść pomiędzy ogranicznikami (tagi HTML, cudzysłowy, nawiasach) wersja leniwa jest prawie zawsze właściwa.
  • Aby dopasować do końca linii, zwykle potrzebujesz zachłanności (.*).

Strategie Chciwy i Leniwy w silniku

Zachłanny kwantyfikator (greedy) zużywa jak najwięcej tekstu i zwraca tylko wtedy, gdy jest wymuszony. Dodając ? (lazy), silnik zużywa absolutne minimum i przesuwa się o jeden znak na raz, szukając następnego dopasowania wzorca.

Spróbuj sam

Ćwiczenie#regex.m2.l3.e1
Próby: 0Ładowanie...

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

Ładowanie edytora...
Pokaż wskazówkę

Greedy <.*> matcha dall'inizio del primo tag fino alla fine dell'ultimo. Lazy <.*?> si ferma al primo > che incontra.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#regex.m2.l3.e2
Próby: 0Ładowanie...

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

Ładowanie edytora...
Pokaż wskazówkę

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

Rozwiązanie dostępne po 3 próbach

Dodatkowe wyzwanie

Ćwiczenie#regex.m2.l3.e3
Próby: 0Ładowanie...

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

Ładowanie edytora...
Pokaż wskazówkę

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

Rozwiązanie dostępne po 3 próbach