假设您有以下文字输入dogcatcatcat和类似的模式dog(cat(catcat))
在这种情况下,您有3个组,第一个(主要组)对应于该比赛。
匹配== dogcatcatcat和组0 ==dogcatcatcat
第一组== catcatcat
组2 == catcat
那到底是什么呢?
让我们考虑一个使用Regex类用C#(.NET)编写的小示例。
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}等。
希望它将有助于阐明Captures,Groups和Matchs之间的区别。
a functionality that won't be used in the majority of cases我想他错过了船。在短期内(?:.*?(collection info)){4,20}将效率提高数百%。