Direkt zum Hauptinhalt springen
eLearner.app
Modul 2 · Lektion 3 von 47/32 im Kurs~10 min
Lektionen des Moduls (3/4)

Greedy vs. Lazy

Standardmäßig sind Quantoren gierig (gierig): Sie verbrauchen das Maximum möglich, wobei das Muster gültig bleibt. Durch Hinzufügen von ? nach a Quantifizierer (*?, +?, ??, {n,m}?) erhalten lazy Version (faul): so wenig wie möglich konsumieren.

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)

Genau das gleiche Muster, nur ein Buchstabe Unterschied (? hinzugefügt Quantor), völlig unterschiedliche Ergebnisse.

Wenn es darauf ankommt

  • Um Inhalte zwischen Trennzeichen zu extrahieren (HTML-Tags, Anführungszeichen, Klammern) ist die faule Version fast immer die richtige.
  • Um zum Zeilenende zu passen, benötigen Sie normalerweise Greedy (.*).

Gierige vs. faule Strategien in der Engine

Ein gieriger Quantifizierer (greedy) verbraucht so viel Text wie möglich und gibt nur zurück, wenn er erzwungen wird. Durch das Hinzufügen von ? (lazy) verbraucht die Engine das Nötigste und rückt ein Zeichen nach dem anderen vor, um nach der nächsten Musterübereinstimmung zu suchen.

Probieren Sie es selbst aus

Übung#regex.m2.l3.e1
Versuche: 0Wird geladen…

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

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#regex.m2.l3.e2
Versuche: 0Wird geladen…

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

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar

Zusätzliche Herausforderung

Übung#regex.m2.l3.e3
Versuche: 0Wird geladen…

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

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar