假设您有以下文字输入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}
将效率提高数百%。