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

    负向零宽断言
     
     
    前面我们提到过怎么查找不是某个字符或不在某个字符类里的字符的方法(反 义)。但是如果我们只是想要确保某个字符没有出现,但并不想去匹配它时怎么办? 例如,如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我 们可以尝试这样:
    \b\w*q[^u]\w*\b 匹配 包含后面不是字母u的字母q的单词 。但是如果多做测试(或 者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话, 像Iraq,Benq,这个表达式就会出错。这是因为 [^u] 总要匹配一个字符,所以如果q是 单词的最后一个字符的话,后面的 [^u] 将会匹配q后面的单词分隔符(可能是空格,或 者是句号或其它的什么),后面的 \w*\b 将会匹配下一个单词,于是 \b\w*q[^u]\w*\b 就 能匹配整个 Iraq fighting 。 负向零宽断言 能解决这样的问题,因为它只匹配一个位 置,并不消费任何字符。现在,我们可以这样来解决这个问题: \b\w*q(?!u)\w*\b 。
    零宽度负预测先行断言 (?!exp) , 断言此位置的后面不能匹配表达式exp 。例 如: \d{3}(?!\d) 匹配 三位数字,而且这三位数字的后面不能是数字 ; \b((?!abc)\w)
     \b 匹配 不包含连续字符串abc的单词 。
    同理,我们可以用 (?<!exp) , 零宽度负回顾后发断言 来 断言此位置的前面不能匹 配表达式exp : (?<![a-z])\d{7} 匹配 前面不是小写字母的七位数字
    一个更复杂的例子: (?<=<(\w )
    
    >).*(?=<\/\1>) 匹配 不包含属性的简单 HTML标签内里的内容 。 (<?(\w )>) 指定了这样的 前缀 : 被尖括号括起
    
    请详细分析表达式 (?<=<(\w )>).*(?
    =<\/\1>) ,这个表达式最能表现零宽断言的 真正用途。
    
    来的单词 (比如可能是<b>),然后是 .* (任意的字符串),最后是一个 后缀 (?=<\/\1>) 。 注意后缀里的 \/ ,它用到了前面提过的字符转义; \1 则是一个反向引用,引用的正 是 捕获的第一组 ,前面的 (\w ) 匹配的内容,这样如果前缀实际上是<b>的话,后缀
    
    就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后
    缀本身)。
     

    

 

相关新闻

2.【运行手册】4大辅导内容
有机化学的研究内容
认识处理器
寄存器使用实例
汇编指令的嵌入
数值运算协处理器
赋值符及表达式
上古歌谣
一个网站的金字塔战略

您可能对这些感兴趣  

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

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

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