当整个模式没有括号时,为什么正则表达式匹配将整个字符串捕获为C#中的一个组?

时间:2017-02-28 00:16:10

标签: c# regex regex-group

群组没有捕捉到我对C#正则表达式的期望。这是一个非常简单的例子:

var matches = Regex.Matches("abcdededefgh","(abc)(de)*(fgh)");

我认为这会将abc,dededede和fgh捕获为3个独立的组,因为每个组都有一组单独的括号。它确实如此,但它也将整个字符串捕获为一个组(作为第一个捕获的四个组)。鉴于我在整个模式中没有括号(即我的模式不是"((abc)(de)*(fgh))"),我不明白为什么要抓获额外的小组。这让我很难预测行为并确定我可以期望哪个组对应于字符串的哪个部分。

另外,请注意以下具有相同的4组结果,因此" 0到很多"在上面的例子中,星号在组括号外面似乎不会影响结果。

var matches = Regex.Matches("abcdededefgh","(abc)((?:de)*)(fgh)");

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

捕获组将覆盖每个量化的传递(a)*
将其更改为(abc)((?:de)*)(fgh)

您看到的额外组包括组0 ,这是整体匹配
正则表达式所以组0,1,2,3 = 4组。