上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
正则表达式中的平衡组/递归匹配
作者:deerchao 申领版权
2010年10月25日 共有 2421 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    平衡组/递归匹配
     
     
    
    有时我们需要匹配像 ( 100 * ( 50
     15 ) )这样的可嵌套的层次性结构 , 这时简单地使用 \(. \) 则只会匹配到
    最左边的左括号和最右边的右括号之
    间的内容(这里我们讨论的是贪婪模
    
    这里介绍的平衡组语法是由.Net Framework支持的;其它语言/库不一定支 持这种功能,或者支持此功能但需要使用 不同的语法。
    式,懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数 不相等,比如 ( 5 / ( 3 2 ) ) ) ,那我们的匹配结果里两者的个数也不会相等。有没有 办法在这样的字符串里匹配到最长的,配对的括号之间的内容呢?
    
     
     
     
    为了避免 ( 和 \( 把你的大脑彻底搞糊涂,我们还是用尖括号代替圆括号吧。现在
    我们的问题变成了如何把 xx <aa <bbb> <bbb> aa> yy 这样的字符串里,最长的配对 的尖括号内的内容捕获出来?
    这里需要用到以下的语法构造:
     
    •  (?'group') 把捕获的内容命名为group,并压入 堆栈(Stack)
    •  (?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为
    空,则本分组的匹配失败
    •  (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表 达式,否则继续匹配no部分
    •  (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
     
    
    我们需要做的是每碰到了左括
    号,就在压入一个"Open",每碰到一个 右括号,就弹出一个,到了最后就看 看堆栈是否为空--如果不为空那就 证明左括号比右括号多,那匹配就应 该失败。正则表达式引擎会进行回溯 (放弃最前面或最后面的一些字符), 尽量使整个表达式得到匹配。
    
     
    如果你不是一个程序员(或者你自称 程序员但是不知道堆栈是什么东西),你 就这样理解上面的三种语法吧:第一个就 是在黑板上写一个"group",第二个就是从 黑板上擦掉一个"group",第三个就是看黑 板上写的还有没有"group",如果有就继续 匹配yes部分,否则就匹配no部分。
    
     
    <                        #最外层的左括号
    [^<>]*               #最外层的左括号后面的不是括号的内容
    (
    (
    (?'Open'<)   #碰到了左括号,在黑板上写一个"Open"
    [^<>]*      #匹配左括号后面的不是括号的内容
    )
    (
    (?'-Open'>)  #碰到了右括号,擦掉一个"Open"
    [^<>]*       #匹配右括号后面不是括号的内容
    )
    )*
    (?(Open)(?!))        #在遇到最外层的右括号前面,判断黑板上还有没有没擦
     
    >                        #最外层的右括号
     
    平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配 嵌套的<div>
    标签 : <div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*) ((?'-Open'</div>)[^<>]*) )*(? (Open)(?!))</div> .

    

 

相关新闻

考点: 盐类的水解
考点:化学反应速率 化学平衡
高考化学识记部分4
高考化学识记部分3
高考化学识记部分2
高考化学识记部分1
《有机化学部分》知识归纳
盐类的水解复习
电离平衡1
化学平衡3

您可能对这些感兴趣  

《VB程序设计基础》选择题
设计模式之Iterator
设计模式之Visitor
设计模式之Interpreter(解释器)
设计模式之Mediator(中介者)
设计模式之Strategy(策略)
设计模式之State
设计模式之Command
设计模式之Chain of Responsibility(职责链)
设计模式之Observer

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》