因此,如果我写一个正则表达式匹配我可以得到匹配或我可以访问其组.这似乎是反直觉的,因为组在表达式中用大括号"("和")"定义.看起来它不仅错误而且多余.谁知道为什么?
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)
我同意-这有点奇怪,但是我认为这样做有充分的理由。
正则表达式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]而不是相反!