MatchCollection mc = Regex.Matches("aab2ba2ab3", @"((?'Open'a)|(?'-Open'b))+(?(Open)2|3)");
foreach (Match m in mc)
{
    Console.WriteLine("匹配内容:" + m.Value + "  匹配开始索引:" + m.Index + "  匹配长度:" + m.Length);
}匹配到aab2和ab3是不是一定要以open开始,以负open开始是不是就不行的?

解决方案 »

  1.   

    这里(?(Open)2|3)
    是不是会去堆栈里去判断有没有Open组存在的啊?
      

  2.   

    参考.NET正则基础之——平衡组 
      

  3.   


    (?'-Open'Exp)中的Exp如果先匹配成功,由于堆栈中还没有入栈的内容,所以也就无法出栈,整个表达式在这一位置就无法匹配成功。所以是要从(?'Open'Exp)匹配开始的
    是的,但前提是,它能够拿到控制权
      

  4.   

    (?(Open)2|3) 
    是不是会去堆栈里去判断有没有Open组存在的啊?lxcnn的回答:
    是的,但前提是,它能够拿到控制权请问一下,拿到控制权是什么意思啊?有点不懂,帮忙再解释一下,谢谢先
      

  5.   

    举个简单的例子,比如正则表达式
    ab
    匹配顺序是从左向右尝试匹配的,也就是说,如果a匹配失败,b的匹配就无从谈起,也就是拿不到控制权,只有当a匹配成功,才会把控制权交给b,由b尝试进行匹配