Представьте, что у вас есть следующий текст dogcatcatcat
и шаблонdog(cat(catcat))
В этом случае у вас есть 3 группы, первая ( основная группа ) соответствует матчу.
Match == dogcatcatcat
и Group0 ==dogcatcatcat
Group1 == catcatcat
Group2 == 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}
эффективность увеличивается более чем на несколько сотен процентов.