Groeperen en hierarchisch matchen
Alterneren staat toe dat je uit verschillende alternatieven kunnen kiezen, maar soms wil je tussen verschillende regexps kunnen kiezen, en soms voor verschillende onderdelen van regeps. Bijvoorbeeld housecats of housekeepers. De regexp housecat|housekeepers zal dat doen, maar is niet erg efficient omdat we house twee keer hebben moeten typen. Het zou mooi zijn om onderdelen van de regexp constant te houden en uit anderen te kunnen kiezen bijvoorbeeld cat|keep.
De grouping metacharacters: () zorgen dat sommige delen als een worden beschouwt. Dus housecat|housekeep kan worden house(cat|keeper).
Voorbeelden:
2
3
4
5
6
7
/ac|b)b/ matched acb of bb
/(^a|b)c/ matched ac aan het begin of bc overal in de string
/(a|[bc])d/ matched ad, bd of cd
/house(cat|) matched housecat of house
/house(cat(s|)|) matched of housecats, housecat of house. (Let op: het innestelen van groepen is mogelijk)
/(19|20|)\d\d/ matched de jaren 19xx, 20xx, of het Y2K probleem: xx
Alternatie gedraagd zich binnen groepen op dezelfde manier als erbuiten. De eerste die voorkomt zal matchen, en de eerste uit de alternatie die mogelijk kan matchen zal matchen.
Hoe dit precies werkt is uitgelegd in een stap bij stap analyse van het volgende commando:
1: Begin met de eerste letter in de string 'a'
2: probeer het eerste alternatief 'abd'
3: match 'a', gevolgd door 'b', to nu toe gaat het goed
4: 'd' in de regexp matched 'c' niet in de string, en deze optie gaat niet werken. Dus moeten we twee tekens terug en proberen we het tweede alternatief uit de groep abc
5: Match 'a' gevolgd door 'b' gevolgd door 'c', dit gaat goed en de eerste groep gaat werken.
6: Ga verder naar de tweede groep en kies het eerste alternatief 'df'
7: Match de 'd'
8: 'f' in de regexp matched de 'e' in de string niet en deze optie gaat niet werken, twee tekens terug, en we gaan verder met het tweede alternatief groep 'd'
9: 'd' matched, de tweede groep matched 'd'
10: we zijn aan het eind van de regexp, en we zijn kaar. We hebben 'abcd' uit de string 'abcde'
Wat opvalt is dat het derde alternatief uit de tweede groep ook 'de' had, maar 'd' was voldoende om de regexp te matchen en toen is de regexp gestopt. Ook was het al bij het eerste teken mogelijk om 'a' te matchen. Was dit niet mogelijk geweest waren eerst alle mogelijk matches verkend voordat we met het hele verhaal bij 'b' opnieuw waren begonnen. Als alle mogelijke opties niet hadden gewerkt, zou preg_match als waarde false terug geven.
Reguliere expressies zijn ondanks al dit werk nog opmerkelijk snel, ondanks dit is preg_match sneller dan de strtr en str_replace functies in php. Zie: http://www.simplemachines.org/community/index.php?topic=175031.0;imode
Inhoudsopgave
- Voorwoord
- My First Regex
- Het gebruik van character classes
- Het een of het ander matchen
- Groeperen en hierarchisch matchen
- Het extraheren van matches
- Repeterende matches
- Disclaimer, bronvermelding, handige links, TODO