Wat is een niet-vangende groep in reguliere uitdrukkingen?

Hoe worden niet-capturing groepen, d.w.z. (?:), gebruikt in reguliere expressies en waar zijn ze goed voor?

?: wordt gebruikt als je een expressie wilt groeperen, maar je wilt het niet opslaan als een gematcht/gevangen deel van de string.

Een voorbeeld zou zijn iets om een IP adres te matchen:

/(?:\d{1,3}\.){3}\d{1,3}/

Merk op dat ik er niet om geef om de eerste 3 octetten op te slaan, maar de (?:...) groepering stelt me in staat om de regex in te korten zonder de overhead van het vastleggen en opslaan van een match.

Commentaren (0)

Het maakt de groep niet-capturing, wat betekent dat de substring waarop die groep matcht niet wordt opgenomen in de lijst van captures. Een voorbeeld in ruby om het verschil te illustreren:

"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]
Commentaren (2)

Groepen die vangen kun je later in de regex gebruiken om te matchen Of je kunt ze gebruiken in het vervangende deel van de regex. Het maken van een niet-vangende groep stelt die groep simpelweg vrij van gebruik voor een van deze redenen.

Niet vastleggen groepen zijn geweldig als je probeert om veel verschillende dingen vast te leggen en er zijn sommige groepen die je niet wilt vastleggen.

Dat is zowat de reden waarom ze bestaan. Terwijl je over groepen leert, leer dan ook over Atomic Groups, ze doen heel veel! Er zijn ook lookaround groepen, maar die zijn wat complexer en worden niet zo veel gebruikt.

Voorbeeld van gebruik later in de regex (backreference):

]*>.*? [ Vindt een xml tag (zonder ns ondersteuning) ]

([A-Z][A-Z0-9]*) is een vastleggende groep (in dit geval is het de tagnaam)

Verderop in de regex staat 1 wat betekent dat het alleen overeenkomt met dezelfde tekst die in de eerste groep stond (de ([A-Z][A-Z0-9]*) groep) (in dit geval komt het overeen met de eind tag).

Commentaren (2)