Уявіть, що у вас є наступне введення тексту 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}підвищується ефективність більш ніж на кілька сотень відсотків.