Bayangkan Anda memiliki input teks dogcatcatcat
dan pola seperti berikutdog(cat(catcat))
Dalam hal ini, Anda memiliki 3 grup, yang pertama ( grup utama ) berhubungan dengan pertandingan.
Cocokkan == dogcatcatcat
dan Group0 ==dogcatcatcat
Group1 == catcatcat
Group2 == catcat
Jadi tentang apa semua ini?
Mari kita pertimbangkan contoh kecil yang ditulis dalam C # (.NET) menggunakan Regex
kelas.
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();
}
Output :
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
Mari kita analisis pertandingan pertama ( match0
).
Seperti yang Anda lihat ada tiga kelompok kecil : group3
, group4
dangroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Kelompok-kelompok tersebut (3-5) diciptakan karena ' subpattern ' (...)(...)(...)
dari pola utama (dog(cat(...)(...)(...)))
Nilai group3
korespondensi dengan tangkapannya ( capture0
). (Seperti dalam kasus group4
dan group5
). Itu karena tidak ada pengulangan kelompok seperti (...){3}
.
Ok, mari kita pertimbangkan contoh lain di mana ada pengulangan grup .
Jika kita mengubah pola ekspresi reguler untuk dicocokkan (untuk kode yang ditunjukkan di atas) dari (dog(cat(...)(...)(...)))
ke (dog(cat(...){3}))
, Anda akan melihat bahwa ada adalah sebagai berikut kelompok pengulangan : (...){3}
.
Sekarang Output telah berubah:
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
Sekali lagi, mari kita analisis pertandingan pertama ( match0
).
Tidak ada lagi grup minor group4
dan group5
karena (...){3}
pengulangan ( {n} dimana n> = 2 ) mereka telah digabung menjadi satu grup tunggal group3
.
Dalam hal ini, group3
nilainya sesuai dengan itu capture2
( tangkapan terakhir , dengan kata lain).
Jadi jika Anda membutuhkan semua 3 menangkap bagian dalam ( capture0
, capture1
, capture2
) Anda harus siklus melalui kelompok Captures
koleksi.
Kesimpulan adalah: perhatikan cara Anda mendesain grup pola Anda. Anda harus berpikir di muka perilaku apa yang menyebabkan spesifikasi, suka (...)(...)
, (...){2}
atau lainnya (.{3}){2}
.
Semoga ini akan membantu menjelaskan perbedaan antara Capture , Grup , dan Pertandingan juga.
a functionality that won't be used in the majority of cases
Saya pikir dia ketinggalan kapal. Dalam jangka pendek(?:.*?(collection info)){4,20}
meningkatkan efisiensi lebih dari beberapa ratus persen.