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.



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