ลองนึกภาพคุณมีตัวอักษรdogcatcatcat
และรูปแบบดังต่อไปนี้dog(cat(catcat))
ในกรณีนี้คุณมี 3 กลุ่มกลุ่มแรก ( กลุ่มหลัก ) สอดคล้องกับการแข่งขัน
จับคู่ == dogcatcatcat
และ Group0 ==dogcatcatcat
กลุ่ม 1 == catcatcat
กลุ่ม 2 == catcat
แล้วมันเกี่ยวกับอะไร
ลองพิจารณาตัวอย่างเล็ก ๆ น้อย ๆ ที่เขียนใน C # (.NET) โดยใช้Regex
คลาส
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();
}
ผลผลิต :
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
ลองวิเคราะห์การจับคู่แรก ( match0
)
ที่คุณสามารถดูมีสามกลุ่มเล็ก ๆ น้อย ๆ : group3
, group4
และgroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
กลุ่มเหล่านั้น (3-5) ถูกสร้างขึ้นเนื่องจาก ' รูปแบบย่อย ' (...)(...)(...)
ของรูปแบบหลัก (dog(cat(...)(...)(...)))
ค่าของgroup3
สอดคล้องกับการจับภาพ ( capture0
) (เช่นในกรณีของgroup4
และgroup5
) นั่นเป็นเพราะไม่มีการทำซ้ำกลุ่ม(...){3}
เช่น
ตกลงขอพิจารณาอีกตัวอย่างหนึ่งที่มีกลุ่มการทำซ้ำ
ถ้าเราปรับเปลี่ยนรูปแบบการแสดงออกปกติที่จะจับคู่ (รหัสที่ปรากฏข้างต้น) จาก(dog(cat(...)(...)(...)))
ไป(dog(cat(...){3}))
คุณจะสังเกตเห็นว่ามีดังต่อไปนี้การทำซ้ำกลุ่ม(...){3}
:
ตอนนี้มีการเปลี่ยนแปลงผลผลิต :
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
อีกครั้งมาวิเคราะห์การแข่งขันนัดแรก ( match0
)
มีไม่มากมีกลุ่มเล็ก ๆ น้อย ๆ group4
และgroup5
เนื่องจากการ(...){3}
ทำซ้ำ ( {n}ประเด็นn> = 2 ) group3
พวกเขาได้รับการรวมอยู่ในกลุ่มเดียว
ในกรณีนี้group3
ค่าที่สอดคล้องกับมันcapture2
( การจับกุมครั้งสุดท้ายในคำอื่น ๆ )
ดังนั้นหากคุณต้องจับทั้งหมดภายใน 3 ( capture0
, capture1
, capture2
) คุณจะต้องผ่านรอบของกลุ่มCaptures
คอลเลกชัน
ข้อสรุปคือ: ใส่ใจกับวิธีที่คุณออกแบบกลุ่มรูปแบบของคุณ คุณควรคิดล่วงหน้าสิ่งที่ทำให้เกิดพฤติกรรมที่สเปคของกลุ่มเช่น(...)(...)
, (...){2}
หรือ(.{3}){2}
อื่น ๆ
หวังว่ามันจะช่วยให้หลั่งน้ำตาแสงบางอย่างเกี่ยวกับความแตกต่างระหว่างจับ , กลุ่มและตรงกันเช่นกัน
a functionality that won't be used in the majority of cases
ฉันคิดว่าเขาพลาดเรือ ในระยะสั้น(?:.*?(collection info)){4,20}
เพิ่มประสิทธิภาพมากขึ้นกว่าร้อยเปอร์เซ็นต์