在C#正则表达式中,为什么初始匹配会显示在组中?

Que*_*mer 13 c# regex

因此,如果我写一个正则表达式匹配我可以得到匹配或我可以访问其组.这似乎是反直觉的,因为组在表达式中用大括号"("和")"定义.看起来它不仅错误而且多余.谁知道为什么?

Regex quickCheck = new Regex(@"(\D+)\d+");
string source = "abc123";

m.Value        //Equals source
m.Groups.Count //Equals 2
m.Groups[0])   //Equals source
m.Groups[1])   //Equals "abc"
Run Code Online (Sandbox Code Playgroud)

And*_*tan 5

我同意-这有点奇怪,但是我认为这样做有充分的理由。

正则表达式Match本身就是一个Group,而反过来又是一个Capture

但是Match.Value(或Capture.Value实际上是)仅在字符串中存在一个匹配项时才有效-如果要匹配模式的多个实例,则根据定义,它不能返回所有内容。实际上Value,“匹配”上的属性为只有匹配时提供了便利。

但是要弄清楚将整个匹配传递到哪里的这种行为是Groups[0]有道理的-考虑一下这个(人为的)天真的代码unminifier的示例:

[TestMethod]
public void UnMinifyExample()
{
  string toUnMinify = "{int somevalue = 0; /*init the value*/} /* end */";
  string result = Regex.Replace(toUnMinify, @"(;|})\s*(/\*[^*]*?\*/)?\s*", "$0\n");
  Assert.AreEqual("{int somevalue = 0; /*init the value*/\n} /* end */\n", result);
}
Run Code Online (Sandbox Code Playgroud)

正则表达式匹配项将在语句末尾保留/ * * /注释,并在其后放置换行符-但适用于任一情况;或}行尾。

好的-您可能想知道为什么要花点正则表达式来烦扰-但让我很幽默:)

如果Groups[0]由该正则表达式的匹配项生成的不是全部内容,则不可能进行一次调用替换-您的问题可能是问为什么将整个匹配项放进去,Groups[0]而不是相反!