Hvordan brukes ikke-fangstgrupper, dvs. (?:)
, i regulære uttrykk, og hva brukes de til?
?:
brukes når du vil gruppere et uttrykk, men ikke vil lagre det som en matchet/fanget del av strengen.
Et eksempel kan være noe som samsvarer med en IP-adresse:
/(?:\d{1,3}\.){3}\d{1,3}/
Merk at jeg ikke bryr meg om å lagre de tre første oktettene, men (?:...)
-grupperingen lar meg forkorte regexen uten å pådra meg overhead for å fange og lagre et treff.
Det gjør gruppen ikke-fangende, noe som betyr at delstrengen som samsvarer med denne gruppen, ikke vil bli inkludert i listen over fangster. Et eksempel i ruby for å illustrere forskjellen:
"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]
Grupper som fanger kan du bruke senere i regexet for å matche ELLER du kan bruke dem i erstatningsdelen av regexet. Å lage en ikke-fangende gruppe unntar ganske enkelt den gruppen fra å bli brukt av en av disse grunnene.
Ikke-fangstgrupper er gode hvis du prøver å fange opp mange forskjellige ting, og det er noen grupper du ikke vil fange opp.
Det er stort sett grunnen til at de eksisterer. Mens du lærer om grupper, lær om Atomic Groups, de gjør mye! Det finnes også lookaround-grupper, men de er litt mer komplekse og brukes ikke så mye.
Eksempel på bruk senere i regex (bakreferanse):
<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>
[Finner en xml-tag (uten ns-støtte) ]
([A-Z][A-Z0-9]*)
er en fangstgruppe (i dette tilfellet er det taggenavnet)
Senere i regexet er \1
som betyr at den bare vil matche den samme teksten som var i den første gruppen (gruppen ([A-Z][A-Z0-9]*)
) (i dette tilfellet matcher den sluttkoden).