Regular Expressions
Lookahead en Lookbehind
Zoeken…
Syntaxis
- Positieve lookahead:
(?=pattern)
- Negatief lookahead:
(?!pattern)
- Achteraf positief :
(?<=pattern)
- Negatief uiterlijk :
(?<!pattern)
Opmerkingen
Niet ondersteund door alle regex-engines.
Bovendien beperken veel regex-motoren de patronen in lookbehinds tot strings met een vaste lengte. Het patroon (?<=a+)b
moet bijvoorbeeld overeenkomen met de b
in aaab
maar geeft een fout in Python.
Het vastleggen van groepen is toegestaan en werkt zoals verwacht, inclusief backreferences. De lookahead / lookbehind zelf is echter geen vanggroep.
Basics
Een positieve lookahead (?=123)
bevestigt dat de tekst wordt gevolgd door het gegeven patroon, zonder het patroon in de wedstrijd op te nemen. Evenzo beweert een positieve terugblik (?<=123)
dat de tekst wordt voorafgegaan door het gegeven patroon. De =
vervangen door !
ontkent de bewering.
Invoer : 123456
-
123(?=456)
overeen met123
( positief uiterlijk ) -
(?<=123)456
overeenkomsten456
( positief vooruit kijken ) -
123(?!456)
mislukt ( negatieve lookahead ) -
(?<!123)456
mislukt ( negatieve achteraf )
Invoer : 456
-
123(?=456)
mislukt -
(?<=123)456
mislukt -
123(?!456)
mislukt -
(?<!123)456
overeen met456
Lookbehind gebruiken om eindes te testen
Een achterhoede kan worden gebruikt aan het einde van een patroon om ervoor te zorgen dat het eindigt of niet op een bepaalde manier.
([az ]+|[AZ ]+)(?<! )
overeen met reeksen van alleen kleine letters of alleen hoofdletters, maar sluit de witruimte aan.
Look-out met variabele lengte simuleren met \ K
Sommige regex-smaken (Perl, PCRE, Oniguruma, Boost) ondersteunen alleen lookbehinds met een vaste lengte, maar bieden de functie \K
, die kan worden gebruikt om lookbehind met variabele lengte te simuleren aan het begin van een patroon. Bij het tegenkomen van een \K
, wordt de overeenkomende tekst tot dit punt weggegooid en wordt alleen de tekst die overeenkomt met het gedeelte van het patroon dat volgt op \K
in het eindresultaat bewaard.
ab+\Kc
Is gelijk aan:
(?<=ab+)c
Over het algemeen een patroon van de vorm:
(subpattern A)\K(subpattern B)
Eindigt vergelijkbaar met:
(?<=subpattern A)(subpattern B)
Behalve wanneer het B-subpatroon kan overeenkomen met dezelfde tekst als het A-subpatroon - kun je eindigen met subtiel verschillende resultaten, omdat het A-subpatroon de tekst nog steeds consumeert, in tegenstelling tot een echte achterom.