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 met 123 ( positief uiterlijk )
  • (?<=123)456 overeenkomsten 456 ( 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 met 456

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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow