Direct naar de hoofdinhoud
Module 2 · Les 3 van 47/32 in de cursus~10 min
Modulelessen (3/4)

Hebzuchtig versus lui

Standaard zijn kwantoren hebzuchtig: ze consumeren zoveel mogelijk terwijl het patroon geldig blijft. ? toevoegen na een kwantor (*?, +?, ??, {n,m}?) geeft je de luie versie: deze verbruikt zo weinig als mogelijk.

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 hetzelfde patroon, één enkel teken verschil (? toegevoegd aan de kwantificator), totaal verschillende resultaten.

Wanneer het er toe doet

  • Om de inhoud tussen scheidingstekens te extraheren (HTML-tags, aanhalingstekens, tussen haakjes) is de luie versie bijna altijd de juiste.
  • Om tot het einde van de regel te matchen, wil je meestal hebzuchtig (.*).

Hebzuchtige versus luie strategieën in de engine

Een hebzuchtige kwantificeerder verbruikt zoveel mogelijk tekst en gaat alleen terug als hij daartoe gedwongen wordt. Door ? (lazy) toe te voegen, verbruikt de engine het absolute minimum en gaat één teken tegelijk vooruit op zoek naar de volgende overeenkomst van het patroon.

Probeer het

Oefening#regex.m2.l3.e1
Pogingen: 0Laden…

Extraheer elke HTML-tag uit het voorbeeld (bijvoorbeeld `<b>`, `</b>`, `<i>`, `</i>`) met behulp van de luie versie `.*?`.

Editor laden…
Toon hint

Greedy <.*> komt overeen vanaf het begin van de eerste tag tot het einde van de laatste. Luie <.*?> stopt bij de eerste > die hij tegenkomt.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#regex.m2.l3.e2
Pogingen: 0Laden…

Extraheer elke tekenreeks tussen dubbele aanhalingstekens in de tekst (bijvoorbeeld "ciao", "mondo"). Gebruik de luie versie van de kwantor om te voorkomen dat u naar latere sluitingen springt.

Editor laden…
Toon hint

".*?" stopt bij het eerste afsluitende dubbele aanhalingsteken.

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#regex.m2.l3.e3
Pogingen: 0Laden…

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.

Editor laden…
Toon hint

Gebruik \\[ voor het open haakje, en dan .*? en ten slotte \\] voor de gesloten beugel.

Oplossing beschikbaar na 3 pogingen