有人可以解释这种行为(或者我做错了什么):
//matches twice (should only match once)
Regex regex = new Regex("(?<=Start )(.*)(?= End)");
Match match = regex.Match("Start blah End");
Console.Out.WriteLine("Groups:" + match.Groups.Count + " " + match.Groups[0] + " " + match.Groups[0]); //2 groups: "blah" and "blah"
//matches once, but blank result (should not match)
Match match2 = regex.Match("Shouldn't match at all");
Console.Out.WriteLine("Groups:" + match2.Groups.Count + " " + match2.Groups[0]); //1 group: ""
答案 0 :(得分:2)
总是返回Groups [0],因为它代表整个表达式。在您的情况下,match2.Groups[0].Success
返回false,因为没有匹配项。 match.Groups[0].Success
返回true,match.Groups[1]
具有匹配的组。
Match.Groups属性返回的GroupCollection对象 总是至少有一个成员。如果是正则表达式引擎 在特定的输入字符串中找不到任何匹配项 Group.Supccess属性集合中的单个Group对象是 设置为false并且Group对象的Value属性设置为 String.Empty。 如果正则表达式引擎可以找到匹配项,那么 组返回的GroupCollection对象的第一个元素 property包含一个与整个正则表达式匹配的字符串 图案。每个后续元素代表一个捕获的组,如果是 正则表达式包括捕获组。欲获得更多信息, 请参阅“分组构造和正则表达式对象”部分 正则表达式中的分组结构文章。