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

Why does regex match capture the whole string as a group in C# when the whole pattern does not have an enclosing parentheses?

组没有捕获我在 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)");

非常感谢您的帮助!

每次量化通过都会覆盖捕获组(a)*
将其更改为 (abc)((?:de)*)(fgh)

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