Kwantificeerders
Met kwantificeerders (quantifiers) kun je aangeven hoe vaak een karakter, karakterklasse of groep opeenvolgend mag of moet voorkomen. De algemene vorm is {min,max}.
Een voorbeeld is de regex bo{1,2}t, welke zowel bot als boot past. En om elke opeenvolging van drie tot en met vijf klinkers te passen, kun je [aeiou]{3,5} gebruiken. Ook kun je een kwantificeerder gebruiken om iets optioneel te maken: vindt{0,1} past zowel vind als vindt. Deze constructie komt vaak genoeg voor om een afkorting te verantwoorden: de regex vindt? is effectief identiek met de voorgaande.
Belangrijk om op dit punt op te merken is dat een kwantificeerder alleen van toepassing is op het direct voorgaande element. Het vraagteken in bovenstaande regex slaat alleen op t, en niet het hele vindt.
Als je iets een bepaald aantal keren wil passen, kun je het minimum gelijkstellen aan het maximum: ^-{80,80}$ past regels die uitsluitend bestaan uit tachtig streepjes. Sommige regex-implementaties staan toe dat deze vorm kan worden afgekort tot {num}. Hiermee kan de vorige regex worden ingekort tot ^-{80}$.
Het is ook toegestaan om de bovengrens weg te laten: a{5,} past elke opeenvolging van tenminste vijf letters 'a'. Het geval van "een of meer" (bijv. a{1,} komt echter veel vaker voor. Daarom is er voor deze vorm een afkorting, de +: a+ en a{1,} zijn effectief gelijk.
Het geval "nul of meer" heeft ook een verkorte vorm: *. Bijvoorbeeld, e* past elk opeenvolgend aantal letters 'e', inclusief nul. Maar pas op: een regex zal altijd proberen om zo "vroeg" (links) mogelijk te passen. Dus als je verwacht dat deze regex, toegepast op beer, de vetgedrukte tekst past, heb je het mis! Dat komt omdat er een opeenvolging van e's aan het begin van de tekst staat, nog voor de b. Het feit dat de opeenvolging nul karakters lang is maakt voor de regex geen verschil. In zo'n geval is de regex e+ dus veel toepasselijker.
Belangrijk om te weten is dat kwantificeerders gulzig (greedy) zijn. Dat betekent dat wanneer je de regex 1* toepast op 11111, het alle 1'en consumeert. Pas wanneer de gulzigheid van een kwantificeerder de oorzaak van een patroon mis-match dreigt te worden zal de kwantificeerder een deel van de tekst die het heeft geconsumeert karaktergewijs teruggeven.
Neem bijvoorbeeld de regex [0-9]*25 bijvoorbeeld, welke getallen past die op 25 eindigen. Als je dit op de tekst 3425 toepast, zal de kwantificeerder eerst de hele tekst consumeren, omdat alle karakters de karakterklasse [0-9] passen. Maar dat voorkomt dat 25 kan passen, waardoor de regex in zijn geheel faalt.
In zulke gevallen zal de kwantificeerder één karakter per keer vrijgeven. Eerst wordt de 5 vrijgegeven, waardoor de kwantificeerder slechts nog 342 past. Wanneer blijkt dat dat nog niet genoeg is, wordt ook de 2 vrijgegeven, waardoor de rest van de regex, 25, ook past.
Dit betekent dat een regex die veel kwantificeerders bevat, een heleboel combinaties moet proberen voor deze faalt. Dus als de tekst waarop de regex wordt toegepast veel bijna-matches veroorzaakt, kan het opeens heel lang duren om de data te verwerken.
Inhoudsopgave
- Inleiding
- Wat zijn het?
- Metakarakters
- Karakterklassen
- De Punt
- Kwantificeerders
- Alternatie
- Groeperen
- Terugverwijzingen
- Ten slotte