Match类:http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.match(v=vs.110).aspx
Groups属性:获取由正则表达式匹配的组的集合。属性值为GroupCollection类型。
我们知道,正则表达式分组中,是以"()"进行分组的,编号为0的组表示整个表达式匹配的内容
例子1:
string s = "百位邻期";
string regx =  "(.*)";
Match match = Regex.Match(s, regx);
Console.WriteLine(match.Groups[0].Value);
Console.WriteLine(match.Groups[1].Value);
Console.ReadKey();上面Groups[0]和Groups[1]输出结果均为:百位邻期例子2:
string s = "百位邻期";
string regx =  "(.*)刘德华|(.*)";
Match match = Regex.Match(s, regx);
Console.WriteLine(match.Groups[0].Value);
Console.WriteLine(match.Groups[1].Value);   //为什么是空
Console.ReadKey();
上面正则表达式,“|”左边的表达式显然是不能匹配的,只有“|”右边的表达式才匹配,可是输出的时候,为什么Groups[1]输出为空呢,和例子1不是一样的吗?请大师指教,谢谢!!!

解决方案 »

  1.   

    (.*)刘德华|(.*)即匹配(.*)刘德华,或者(.*)(.*)刘德华  显然不匹配,所以刘德华左边的捕获组(.*)为空,即Group[1].Value为空
      

  2.   

    http://topic.csdn.net/u/20120528/19/b7fd54ab-5524-4724-b6fb-833b2baa5e0f.html
      

  3.   

    首先你要清楚捕获组的编号规则,可以参考
    正则基础之——捕获组(capture group) string s = "百位邻期";
    Regex reg = new Regex(@"(.*)刘德华|(.*)");
    Match m = reg.Match(s);
    richTextBox2.Text = "捕获组数量:" + reg.GetGroupNumbers().Length + "\n";
    for (int i = 0; i < reg.GetGroupNumbers().Length; i++)
    {
        richTextBox2.Text += "捕获组 " + i + " 捕获内容:" + m.Groups[i].Value + "\n";
    }
    /*-----输出-----
    捕获组数量:3
    捕获组 0 捕获内容:百位邻期
    捕获组 1 捕获内容:
    捕获组 2 捕获内容:百位邻期
    */因为匹配之前你是不知道哪个分支可以匹配成功的,所以不能认为匹配不成功的捕获组就不参与编号,我们要从正则的规则去推断结果,而不是从匹配结果来反推正则的规则
    (.*)刘德华中的(.*)在匹配“百位邻期”虽然没有匹配到,但它也是参与捕获组的编号的
    而在匹配“百位邻期刘德华”时,Groups[1]就可以得到匹配内容了
    string s = "百位邻期刘德华";
    Regex reg = new Regex(@"(.*)刘德华|(.*)");
    Match m = reg.Match(s);
    richTextBox2.Text = "捕获组数量:" + reg.GetGroupNumbers().Length + "\n";
    for (int i = 0; i < reg.GetGroupNumbers().Length; i++)
    {
        richTextBox2.Text += "捕获组 " + i + " 捕获内容:" + m.Groups[i].Value + "\n";
    }
    /*-----输出-----
    捕获组数量:3
    捕获组 0 捕获内容:百位邻期刘德华
    捕获组 1 捕获内容:百位邻期
    捕获组 2 捕获内容:
    */
      

  4.   

    Regex reg = new Regex(@"(.*)刘德华|(百)");
    试试。