Regular Expressions
Atoomgroepering
Zoeken…
Invoering
Met reguliere niet-vastleggende groepen kan de engine de groep opnieuw invoeren en proberen iets anders te matchen (zoals een andere afwisseling of minder tekens matchen wanneer een kwantificator wordt gebruikt).
Atoomgroepen verschillen van reguliere niet-vastleggende groepen in die zin dat backtracking verboden is. Zodra de groep is afgesloten, wordt alle backtracking-informatie weggegooid, zodat er geen alternatieve matches kunnen worden geprobeerd.
Opmerkingen
Een bezitterige kwantificeerder gedraagt zich als een atoomgroep in die zin dat de motor niet in staat is om terug te gaan over een token of groep.
De volgende functies zijn equivalent qua functionaliteit, hoewel sommige sneller zijn dan andere:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Groeperen met (?>)
Een atoomgroep gebruiken
Atoomgroepen hebben het formaat (?>...)
met een ?>
Achter de open paren.
Overweeg de volgende voorbeeldtekst:
ABC
De regex zal proberen te matchen vanaf positie 0 van de tekst, die vóór de A
in ABC
.
Als een niet-hoofdlettergevoelige uitdrukking (?>a*)abc
gebruikt, komt de (?>a*)
overeen met 1 A
teken, waardoor
BC
als de resterende overeenkomende tekst. De groep (?>a*)
wordt afgesloten en er wordt geprobeerd abc
uit te voeren op de resterende tekst, die niet overeenkomt.
De motor kan niet teruggaan naar de atoomgroep en daarom mislukt de huidige doorgang. De motor gaat naar de volgende positie in de tekst, die positie 1 zou zijn, die zich achter de A
en vóór de B
van ABC
.
De regex (?>a*)abc
wordt opnieuw geprobeerd en (?>a*)
A
(?>a*)
komt 0 keer overeen met A
BC
als de resterende overeenkomende tekst. De (?>a*)
groep wordt verlaten en abc
wordt geprobeerd, wat mislukt.
Nogmaals, de motor kan niet teruggaan naar de atoomgroep, en dus mislukt de huidige doorgang. De regex blijft mislukken totdat alle posities in de tekst zijn uitgeput.
Een niet-atoomgroep gebruiken
Reguliere niet-vastleggende groepen hebben het formaat (?:...)
met een ?:
Achter de open paren.
Gegeven dezelfde voorbeeldtekst, maar met de hoofdletterongevoelige uitdrukking (?:a*)abc
plaats daarvan zou er een overeenkomst optreden omdat terugtracking is toegestaan.
In het begin verbruikt (?:a*)
de letter A
in de tekst
ABC
verlaten
BC
als de resterende overeenkomende tekst. De groep (?:a*)
wordt verlaten en er wordt geprobeerd abc
uit te voeren op de resterende tekst, die niet overeenkomt.
De engine keert terug naar de (?:a*)
groep en probeert 1 minder karakter te matchen: in plaats van 1 A
karakter te matchen, probeert het 0 A
karakters te matchen, en de (?:a*)
groep wordt verlaten. Dit vertrekt
ABC
als de resterende overeenkomende tekst. De regex abc
kan nu met succes de resterende tekst matchen.
Andere voorbeeldtekst
Beschouw deze voorbeeldtekst met zowel atomaire als niet-atomaire groepen (nogmaals, niet hoofdlettergevoelig):
AAAABC
De regex zal proberen te matchen vanaf positie 0 van de tekst, die vóór de eerste A
in AAAABC
.
Het patroon dat de atoomgroep (?>a*)abc
, kan niet overeenkomen en gedraagt zich bijna identiek aan het bovenstaande atomaire ABC
voorbeeld: alle 4 van de A
tekens worden eerst gekoppeld aan (?>a*)
( BC
verlaten als de resterende tekst) en abc
kan niet overeenkomen met die tekst. De groep kan niet opnieuw worden ingevoerd, dus de wedstrijd mislukt.
Het patroon dat de niet-atomaire groep (?:a*)abc
, kan overeenkomen, vergelijkbaar met het niet-atomaire ABC
voorbeeld hierboven: alle 4 van de A
tekens worden eerst gekoppeld aan (?:a*)
(verlaten BC
als de resterende overeenkomende tekst) en abc
kan niet overeenkomen met die tekst. De groep is in staat om opnieuw worden ingevoerd, zodat men minder A
wordt geprobeerd: 3 A
karakters worden aangepast in plaats van 4 (het verlaten van ABC
als de rest van de tekst te match), en abc
is in staat om met succes te passen op die tekst.