如果你不是一个程序员(或者你是一个对堆栈的概念不熟的程序员),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个 "group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配 no部分。
我们需要做的是每碰到了左括号,就在黑板上写一个"group",每碰到一个右括号,就擦掉一个,到了最后就看看黑板上还有没有--如果有那就证明左括号比右括号多,那匹配就应该失败。 
<                         #最外层的左括号
    [^<>]*                #最外层的左括号后面的不是括号的内容
    (
        (
            (?'Open'<)    #碰到了左括号,在黑板上写一个"Open"
            [^<>]*       #匹配左括号后面的不是括号的内容
        )+
        (
            (?'-Open'>)   #碰到了右括号,擦掉一个"Open"
            [^<>]*        #匹配右括号后面不是括号的内容
        )+
    )*
    (?(Open)(?!))         #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败
>                         #最外层的右括号
平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的<div>标签:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

解决方案 »

  1.   

    非常感谢,堆栈我很清楚!我现在不明白的是?(Open)  与  (?!),我在正则表达式语言元素中根本找不到这两种东西!
      

  2.   

    LZ看下这里:
    http://www.cnblogs.com/symbol441/archive/2007/12/20/1006091.html
    里面说得很清楚。。
      

  3.   


    楼主说的这部分,完成的语法是这样的:(?(Open)yes|no)
    如果堆栈上存在以名为Open的捕获内容的话,则匹配yes部分,否则匹配no部分,其中no部分可以省略,(?!)就是yes部分表达式,no部分省略(?!) 因为?!后没有任何内容,所以试图匹配总是失败的(?(Open)yes|no)整个表达式的意思就是,如果堆栈中还有Open匹配到的内容,那就整个表达式的匹配就是失败的,也就是说Open和-Open匹配的内容并不是配对出现的,作用就是检查是否配对,不配对则不匹配,配对则不做任何操作,也就是匹配成功