正则表达式返回额外的空白组

时间:2014-03-04 01:52:30

标签: c# .net regex

有人可以解释这种行为(或者我做错了什么):

//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: ""

1 个答案:

答案 0 :(得分:2)

总是返回Groups [0],因为它代表整个表达式。在您的情况下,match2.Groups[0].Success返回false,因为没有匹配项。 match.Groups[0].Success返回true,match.Groups[1]具有匹配的组。

来自documentation

  

Match.Groups属性返回的GroupCollection对象   总是至少有一个成员。如果是正则表达式引擎   在特定的输入字符串中找不到任何匹配项   Group.Supccess属性集合中的单个Group对象是   设置为false并且Group对象的Value属性设置为   String.Empty。 如果正则表达式引擎可以找到匹配项,那么   组返回的GroupCollection对象的第一个元素   property包含一个与整个正则表达式匹配的字符串   图案。每个后续元素代表一个捕获的组,如果是   正则表达式包括捕获组。欲获得更多信息,   请参阅“分组构造和正则表达式对象”部分   正则表达式中的分组结构文章。