因此,如果我编写一个匹配的正则表达式,我可以获得匹配项或者我可以访问它的组。这似乎违反直觉,因为组是在表达式中用大括号“(”和“)”定义的。这似乎不仅是错误的,而且是多余的。有谁知道为什么吗?
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"
最佳答案
我同意 - 这有点奇怪,但我认为这是有充分理由的。
Regex Match
本身就是一个 Group
,它又是一个 Capture
。
但 Match.Value
(或 Capture.Value
实际上是这样)仅在字符串中存在一个匹配项时才有效 - 如果您匹配多个模式的实例,那么根据定义它不能返回所有内容。实际上 - Match 上的 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);
}
正则表达式匹配将在语句末尾保留/* */注释,然后放置一个换行符 - 但适用于任何一个;或 } 行尾。
好吧 - 你可能想知道为什么你会费心用正则表达式来做这个 - 但请原谅我:)
如果此正则表达式的匹配生成的 Groups[0]
不是整个捕获 - 那么单次调用替换是不可能的 - 你的问题可能是问为什么 不会将整个比赛放入 Groups[0]
而不是相反!
关于c# - 在 C# 正则表达式中,为什么初始匹配出现在组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248213/