Ako sa v regulárnych výrazoch používajú skupiny, ktoré sa nezachytávajú, t. j. (?:)
, a na čo sú dobré?
?:
sa používa, keď chcete zoskupiť výraz, ale nechcete ho uložiť ako porovnanú/zachytenú časť reťazca.
Príkladom môže byť niečo, čo zodpovedá IP adrese:
/(?:\d{1,3}\.){3}\d{1,3}/
Všimnite si, že mi nezáleží na uložení prvých 3 oktetov, ale zoskupenie (?:...)
mi umožňuje skrátiť regex bez toho, aby som musel znášať réžiu spojenú so zachytávaním a ukladaním zhody.
Tým sa skupina stane nezachytávacou, čo znamená, že podreťazec, ktorému táto skupina zodpovedá, nebude zahrnutý do zoznamu zachytených reťazcov. Príklad v jazyku ruby na ilustráciu rozdielu:
"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]
Skupiny, ktoré zachytíte, môžete neskôr použiť v regexe na porovnanie alebo ich môžete použiť v časti regexu na nahradenie. Vytvorenie skupiny nezachytávajúcej jednoducho vylučuje túto skupinu z použitia na niektorý z týchto dôvodov.
Nezachytávajúce skupiny sú skvelé, ak sa snažíte zachytiť veľa rôznych vecí a niektoré skupiny nechcete zachytiť.
To je v podstate dôvod ich existencie. Kým sa naučíte o skupinách, naučte sa o Atomic Groups, robia toho veľa! Existujú aj lookaround groups, ale tie sú trochu zložitejšie a nepoužívajú sa tak často.
Príklad použitia neskôr v regexe (spätný odkaz):
<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>
[ Nájde xml tag (bez podpory ns) ]
([A-Z][A-Z0-9]*)
je zachytávajúca skupina (v tomto prípade je to názov značky)
Neskôr v regexe je \1
, čo znamená, že bude vyhovovať len tomu istému textu, ktorý bol v prvej skupine (skupina ([A-Z][A-Z0-9]*)
) (v tomto prípade je to vyhovujúci koncový tag).