Yakalamayan gruplar, yani (?:)
, düzenli ifadelerde nasıl kullanılır ve ne işe yarar?
?:`, bir ifadeyi gruplamak istediğinizde, ancak bunu dizenin eşleşen/yakalanan bir bölümü olarak kaydetmek istemediğinizde kullanılır.
Örnek olarak bir IP adresiyle eşleşecek bir şey verilebilir:
/(?:\d{1,3}\.){3}\d{1,3}/
İlk 3 okteti kaydetmeyi önemsemediğimi, ancak (?:...)
gruplamasının bir eşleşmeyi yakalama ve saklama ek yüküne maruz kalmadan regex'i kısaltmama izin verdiğini unutmayın.
Grubu yakalamasız hale getirir, yani bu grup tarafından eşleştirilen alt dizenin yakalama listesine dahil edilmeyeceği anlamına gelir. Farkı göstermek için ruby'de bir örnek:
"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]
Yakaladığınız grupları daha sonra eşleştirmek için regex'te kullanabilirsiniz YA DA regex'in değiştirme kısmında kullanabilirsiniz. Yakalamayan bir grup oluşturmak, o grubu bu nedenlerden herhangi biri için kullanılmaktan muaf tutar.
Yakalamayan gruplar, birçok farklı şeyi yakalamaya çalışıyorsanız ve yakalamak istemediğiniz bazı gruplar varsa harikadır.
Var olmalarının sebebi de bu zaten. Gruplar hakkında bilgi edinirken, Atomik Gruplar hakkında da bilgi edinin, çok şey yapıyorlar! Ayrıca lookaround grupları da vardır ancak bunlar biraz daha karmaşıktır ve çok fazla kullanılmazlar.
Regex'te daha sonra kullanım örneği (geri referans):
<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>
[ Bir xml etiketi bulur (ns desteği olmadan) ]
([A-Z][A-Z0-9]*)` bir yakalama grubudur (bu durumda tagname'dir)
Regex'in ilerleyen kısımlarında \1
ifadesi yer alır, bu da yalnızca ilk gruptaki (([A-Z][A-Z0-9]*)
grubu) metinle eşleşeceği anlamına gelir (bu durumda son etiketle eşleşir).