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.
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
Extraheer elke HTML-tag uit het voorbeeld (bijvoorbeeld `<b>`, `</b>`, `<i>`, `</i>`) met behulp van de luie versie `.*?`.
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
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.
Toon hint
".*?" stopt bij het eerste afsluitende dubbele aanhalingsteken.
Oplossing beschikbaar na 3 pogingen
Extra uitdaging
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.
Toon hint
Gebruik \\[ voor het open haakje, en dan .*? en ten slotte \\] voor de gesloten beugel.
Oplossing beschikbaar na 3 pogingen