Passer au contenu principal
eLearner.app
Module 2 · Leçon 3 sur 47/32 dans le cours~10 min
Leçons du module (3/4)

Greedy vs lazy

Par défaut les quantificateurs sont gourmands (gourmands) : ils consomment le maximum possible en gardant le modèle valide. En ajoutant ? après un quantificateur (*?, +?, ??, {n,m}?) obtient la version paresseuse (paresseux) : consommer le moins possible.

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)

Exactement le même modèle, juste une différence de lettre (? ajouté à quantificateur), des résultats totalement différents.

Quand c'est important

  • Pour extraire le contenu entre délimiteurs (balises HTML, guillemets, parenthèses), la version paresseuse est presque toujours la bonne.
  • Pour faire correspondre à la fin de la ligne, vous voulez généralement gourmand (.*).

Stratégies gourmandes ou paresseuses dans le moteur

Un quantificateur glouton (greedy) consomme autant de texte que possible et ne renvoie que s'il est forcé. En ajoutant ? (lazy), le moteur consomme le strict minimum et avance d'un caractère à la fois à la recherche de la prochaine correspondance de modèle.

Essayez-le vous-même

Exercice#regex.m2.l3.e1
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Exercice de révision

Exercice#regex.m2.l3.e2
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#regex.m2.l3.e3
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives