Aşağıdaki metin girişine dogcatcatcat
ve benzeri bir desene sahip olduğunuzu düşünündog(cat(catcat))
Bu durumda, 3 grubunuz var, birincisi ( büyük grup ) maça karşılık gelir.
Maç == dogcatcatcat
ve Grup0 ==dogcatcatcat
Grup1 == catcatcat
Grup2 == catcat
Peki bütün bunlar ne demek?
Regex
Sınıf kullanarak C # (.NET) ile yazılmış küçük bir örneği ele alalım .
int matchIndex = 0;
int groupIndex = 0;
int captureIndex = 0;
foreach (Match match in Regex.Matches(
"dogcatabcdefghidogcatkjlmnopqr", // input
@"(dog(cat(...)(...)(...)))") // pattern
)
{
Console.Out.WriteLine($"match{matchIndex++} = {match}");
foreach (Group @group in match.Groups)
{
Console.Out.WriteLine($"\tgroup{groupIndex++} = {@group}");
foreach (Capture capture in @group.Captures)
{
Console.Out.WriteLine($"\t\tcapture{captureIndex++} = {capture}");
}
captureIndex = 0;
}
groupIndex = 0;
Console.Out.WriteLine();
}
Çıktı :
match0 = dogcatabcdefghi
group0 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group1 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group2 = catabcdefghi
capture0 = catabcdefghi
group3 = abc
capture0 = abc
group4 = def
capture0 = def
group5 = ghi
capture0 = ghi
match1 = dogcatkjlmnopqr
group0 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group1 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group2 = catkjlmnopqr
capture0 = catkjlmnopqr
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Sadece ilk maçı analiz edelim ( match0
).
Gördüğünüz gibi orada üç şunlardır minör grupları : group3
, group4
vegroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Bu gruplar, (3-5) için 'arasında oluşturulan alt modeli ' (...)(...)(...)
bölgesinin temel desen (dog(cat(...)(...)(...)))
Değeri, group3
yakalama ( capture0
) öğesine karşılık gelir . (Durumunda olduğu gibi group4
ve group5
). Çünkü hiçbir grup tekrarlama vardır gibi (...){3}
.
Tamam, bir grup tekrarının olduğu başka bir örneği ele alalım .
Biz dan (kod yukarıda gösterilen için) eşleştirilecek düzenli ifade deseni değiştirirseniz (dog(cat(...)(...)(...)))
için (dog(cat(...){3}))
, aşağıdaki olduğunu fark edeceksiniz grup tekrarı : (...){3}
.
Şimdi Çıktı değişti:
match0 = dogcatabcdefghi
group0 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group1 = dogcatabcdefghi
capture0 = dogcatabcdefghi
group2 = catabcdefghi
capture0 = catabcdefghi
group3 = ghi
capture0 = abc
capture1 = def
capture2 = ghi
match1 = dogcatkjlmnopqr
group0 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group1 = dogcatkjlmnopqr
capture0 = dogcatkjlmnopqr
group2 = catkjlmnopqr
capture0 = catkjlmnopqr
group3 = pqr
capture0 = kjl
capture1 = mno
capture2 = pqr
Yine, sadece ilk maçı analiz edelim ( match0
).
Artık küçük gruplar yok group4
ve tekrarlamagroup5
nedeniyle ( {n} burada n> = 2 ) tek bir grupta birleştirildi .(...){3}
group3
Bu durumda, group3
değer ona capture2
( son yakalama , diğer bir deyişle) karşılık gelir.
Tüm 3 iç yakalar ihtiyaç Böylece if ( capture0
, capture1
, capture2
) sen grubun arasında geçiş yapmak gerekecek Captures
koleksiyonu.
Çözüm: modelinizin gruplarını nasıl tasarladığınıza dikkat edin. Sen davranış gibi grubun şartname neyin sebep peşin düşünmelidir (...)(...)
, (...){2}
ya (.{3}){2}
vs.
Umarım Yakalamalar , Gruplar ve Maçlar arasındaki farklara da ışık tutmaya yardımcı olur .
a functionality that won't be used in the majority of cases
Sanırım tekneyi kaçırdı. Kısa vadede(?:.*?(collection info)){4,20}
verimliliği yüzde yüz daha fazla arttırır.