Hãy tưởng tượng bạn có kiểu nhập văn bản sau dogcatcatcat
và một mẫu nhưdog(cat(catcat))
Trong trường hợp này, bạn có 3 nhóm, nhóm đầu tiên ( nhóm chính ) tương ứng với trận đấu.
Khớp == dogcatcatcat
và Group0 ==dogcatcatcat
Nhóm1 == catcatcat
Nhóm2 == catcat
Vì vậy, tất cả những gì về?
Chúng ta hãy xem xét một ví dụ nhỏ được viết bằng C # (.NET) bằng cách sử dụng Regex
lớp.
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();
}
Đầu ra :
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
Hãy phân tích trận đấu đầu tiên ( match0
).
Như bạn có thể thấy có ba nhóm nhỏ : group3
, group4
vàgroup5
group3 = kjl
capture0 = kjl
group4 = mno
capture0 = mno
group5 = pqr
capture0 = pqr
Những nhóm đó (3-5) đã được tạo vì ' mẫu con ' (...)(...)(...)
của mẫu chính (dog(cat(...)(...)(...)))
Giá trị group3
tương ứng với nó chụp ( capture0
). (Như trong trường hợp group4
và group5
). Đó là bởi vì không có sự lặp lại nhóm như thế nào (...){3}
.
Ok, hãy xem xét một ví dụ khác khi có sự lặp lại của nhóm .
Nếu chúng ta sửa đổi các mẫu biểu thức chính quy để được xuất hiện (đối với mã hiển thị ở trên) từ (dog(cat(...)(...)(...)))
đến (dog(cat(...){3}))
, bạn sẽ nhận thấy rằng có những điều sau nhóm lặp lại : (...){3}
.
Bây giờ Đầu ra đã thay đổi:
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
Một lần nữa, hãy phân tích trận đấu đầu tiên ( match0
).
Không còn các nhóm nhỏ nữa group4
và group5
vì (...){3}
sự lặp lại ( {n} trong đó n> = 2 ) chúng đã được hợp nhất thành một nhóm duy nhất group3
.
Trong trường hợp này, group3
giá trị tương ứng với nó capture2
( lần chụp cuối cùng , nói cách khác).
Vì vậy, nếu bạn cần tất cả 3 ảnh chụp bên trong ( capture0
, capture1
, capture2
), bạn sẽ phải lướt qua của nhóm Captures
bộ sưu tập.
Loại trừ là: chú ý đến cách bạn thiết kế các nhóm mẫu của bạn. Bạn nên suy nghĩ trước những hành vi gây ra đặc điểm kỹ thuật của nhóm, như (...)(...)
, (...){2}
hoặc (.{3}){2}
vv
Hy vọng rằng nó cũng sẽ giúp làm sáng tỏ sự khác biệt giữa Chụp , Nhóm và Trận đấu .
a functionality that won't be used in the majority of cases
Tôi nghĩ rằng anh ấy đã bỏ lỡ chiếc thuyền. Trong ngắn hạn,(?:.*?(collection info)){4,20}
tăng hiệu quả lên vài trăm phần trăm.