如题,非常不好理解。
栈是肯定知道的。但是配上她的语法,我头都晕啦
http://deerchao.net/tutorials/regex/regex.htm#escape
然后找到“ 平衡组/递归匹配 ”
这里应该怎样理解,这个平衡组有什么意义呢?
下面的是msdn的说明:这里还出现<name1-name2>而不是<-name2>,这个也是正确的吗?
(?<name1-name2>子表达式)
定义平衡组定义。
(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$
“3+2^((1-3)*(3-1))”中的“((1-3)*(3-1))”

解决方案 »

  1.   

    <div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>
    这个正则好像很复杂,应该怎样来读
      

  2.   

    当然了。最好还是看过客的博客。
    就我简单的理解
    ()
    分组你知道把,分组的内容要创建堆栈来保存。
    平衡组不过就是增加了一个出栈的功能,简单说,
    (?<open>)分组捕获到内容
    (?<任意字符-open>)分组捕获到,则将open弹出分组
    最终通过(?(opne))检查open是否有捕获到,因为(?<任意字符-open>)如果和open的次数一样出现,则最终应该没有被捕获的open,所以不会有成功捕获。以达到检查open和-open的分组是否个数一样的目的。这就是平衡组的目的和实现。你写的正好是过客所说的狭义平衡组。不知道你明白没,反正我觉得我这样说法,比较简单。
      

  3.   

    <div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>你看到这个,你一定去过过客博客看过了。
    这个很简单。不过是复杂点,如果需要,一会解释儿子来闹了。
      

  4.   

    http://deerchao.net/tutorials/regex/regex.htm#escape上边不是有详细的解释么...
      

  5.   

    是清楚,但是还是看不明白,也不知道他的目的,貌似就是要找 对称的 “()”,
    我不用open这个名字也是可以的吧。怎么个个都是用open的呢。
      

  6.   

    需要理解的是这个东西:(?(Open)(?!))他的意思是不平衡就匹配失败
      

  7.   

    open只是一个分组名(吧),随意起...
      

  8.   

    谢谢大家帮忙
    <div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>
    这个不是找到最内层的div吗?

    <div[^>]*>[^<>] 就表明中间是不能有html标签了
      

  9.   

    <div><div></div>asdfasd<div/><div></div></div>
    <div>
           name:<span>xxxx</span>
          age:<span>23</span>
    </div>
    在这里只匹配
    <div></div>
    <div/><div></div></div>
    我就不知道这个平衡组有什么用。
    好像他找html标签也是不能一对对找出来的
      

  10.   


    (?'Close-Open'expression) 可以简写为 (?'-Open'expression)
    它与(?'Open'expression)是对应的(?'Open'expression)匹配成功一次就相当于入栈,(?'-Open'expression)匹配成功一次就相当于出栈
    比如(a+(b+c))
    (?'Open'\() 匹配的是开括弧
    (?'-Open'\)) 匹配的是闭括弧
    匹配“a”前的“(”入栈,再匹配“b”前的“(”入栈,接着匹配“c”后的两个“)”分别出栈,此时栈内是空的,也就表标入栈和出栈的次数是一致的,也就是起始标志“(”和结束标志“)”是配对出现的而如果源字符串换成:((a+(b+c))
    由于第一个“(”没有与之配对的“)”,入栈次数与出栈次数不同,栈内还有数据,也就表示不配对,在位置0位是匹配不成功的楼主所给的正则不易理解,也不易构造,不适合所有情况,换成下面的写法就容易理解多了
    string test = "(a+(b+c))+(d+e)";
    Regex reg = new Regex(@"\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Value + "\n";
    }更详细的可以参考我的博客
    .NET正则基础之——平衡组 
      

  11.   

    (?'kf'\()[^()]*(?'-kf'\))
    \(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
    第一个与第二个有什么差别呢?
    我的目的也是一碰到(就压栈,括号之间可以有n个非()的字符,之后一碰到),就弹栈,但是
    我用第一个匹配(a+(b+c))+(d+e) ,第一个括号是取不出来的,
    (b+c),与(d+e)。
    我也在你的博客里看。笨啊,没能那么快理解。
      

  12.   


    广义平衡组的目的是为了匹配成对出现的子串,多用于html代码中的标签匹配Open就是命名捕获组的name,随意起,只要(?<name>exp)和(?<-name>exp)对应上就可以先看下我的博客吧,有不清楚的地方可以提出来
      

  13.   

    谢谢,Peter200694013
    但是他匹配层次性结构的那些部分呢?
    (a+(b+c))+(d+e)
    我可以将()看成html标签,
    但是他也只是找到
    (a+(b+c))
    (d+e)

    (b+c)没找出来。
    不知道是不是这个意思。
    如果用到div里 就是 将所有div的innerhtml取出来吗?
      

  14.   

    对于平衡组的应用也是一样,如果分组构造中没有量词,那么使用固化分组就是没有意义的,比如版本0Regex reg = new Regex(@"\((?>(?<Open>\()|(?<-Open>\))|.)*?(?(Open)(?!))\)");量词是啥意思?
    写得太好啦,我还没看完。回家再看。。学习得太多啦
      

  15.   


    表示匹配次数的就是量词,如
    ?、*、+、{m,n}、{m,}等等
      

  16.   

    呵呵,我从不提倡把正则当模板来用不过对于平衡组来说,当你尝试着去构建一个平衡组时,你的分析过程,确实是可以套用模板的就比如说匹配()嵌套结构的平衡组吧
    \(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
    构成一个平衡组的几部分
    1、表达式的开始,起始标记,此处为“\(”
    2、入栈捕获组,此处为(?<Open>\()
    3、出栈捕获组,此处为(?<-Open>\))
    4、除需入栈或出栈子表达式所匹配内容之外的字符,此处为[^()]
    5、是否配对的判断,固定为(?(Open)(?!))
    6、表达式的结束,结束标记,此处为“\)”
    放在一起,OK,一个平衡组已经完成了,接下来的就是一些优化工作了这是单字符的,对于子符组的,比如匹配<div>...</div>嵌套结构的,其它都没什么好说的,只有
    4、除需入栈或出栈子表达式所匹配内容之外的字符,此处为(?:(?!</?div\b).)
    组成的正则就是
    (?is)<div[^>]*>(?><div[^>]*>(?<o>)|</div>(?<-o>)|(?:(?!</?div\b).)*)*(?(o)(?!))</div>
    绝大多数情况下,这是没有问题的但是除非你真的理解每一个细节,否则不要这样去拼平衡组,因为你并不知道这样做是否会有潜在的陷阱
      

  17.   

    狭义的平衡组仅仅指(?<Close-Open>Expression)语法规则,而广义的平衡组,我也说过,广义平衡组并不是固定的语法规则,而是几种语法规则的综合运用。这样说来,平衡组的格式或者说构成可以是多种多样的,上面这种结构是平衡组一种比较模板化的结构,特点是清晰,易读,易构造,相对来讲效率也比较高其它的写法,以前用过几次,觉得构造麻烦,量词嵌套多影响效率,所以后来的平衡组都统一用这种构造来写了