绿色风's Blog
澳门的百家乐|专注AutoIT(Au3)
  • 首页
  • 流●年
  • 笔●记
    • 学习随记
    • 源码示例
  • 脚●本
    • UDF(收集)
    • 工作室UDF
    • 工具●教程
    • 教程之GDI
  • 微●语
  • 作●品
  • 下●载
  • 关于我
3月302016

au3 正则参考 -64-负预测先行断言

作者:绿色风   发布:2016-3-30 19:27 Wednesday   分类:工具●教程   阅读:4327次   评论:0条  
RegExp

负预测先行断言: (?!断言模式)

断言模式为有效正则表达式模式. 若要成功匹配, 则输入字符串必须不匹配断言模式的匹配项, 尽管断言模式的匹配项不会包含到最终匹配结果中.

预测先行断言匹配时向右搜索断言模式.

负预测先行断言通常用在正则表达式的开头或结尾:
定义在正则表达式的开头, 表示不能在匹配项的开头处出现断言模式指定的字符串.
定义在正则表达式的末尾, 表示不能在匹配项的末尾处出现断言模式的指定字符串.

负预测先行功能只在断言模式匹配失败的情况下表达式才能成功匹配. 这对于删改一个搜索特别有用, 因为提供应被排除的断言模式通常比提供必须被包括在内的表达式要简单一些.

例如, 编写搜索不以 non 起始的单词的表达式就很困难. 下面的示例使用负预测先行来排除它们.

字符串: Nonsense is not always non-functional.

表达式: \b(?!non)\w+\b

匹配结果(标志 3):
[0]Nonsense          Non 不匹配断言模式的 non
[1]is
[2]not
[3]always
[4]functional

表达式分析:

模式 说明
\b 在单词边界处开始匹配.
(?!non) 查看前一个字符以确保当前字符串不以 non 开始. 如果当前字符串以 non 开始, 则匹配失败.
\w+ 匹配一个或多个单词字符.
\b 在单词边界处结束匹配.

 

下面示例在正则表达式开头使用负预测先行断言定义, 以匹配不以字符串 un 开头的单词.

字符串: unite one unethical ethics use untie ultimate

表达式: \b(?!un)\w+\b

匹配结果(标志 3):
[0]one
[1]ethics
[2]use
[3]ultimate

表达式分析:

模式 说明
\b 在单词边界处开始匹配.
(?!un) 负预测先行断言. 确定 \b 后接下来的两个字符是否为 un , 如果不是则可以匹配.
如果 (?!un) 匹配成功 , 则匹配结果及其后的 1 或多个单词字符排除在最终匹配结果之外 ;
如果 (?!un) 匹配失败 , 则捕获的 1 或多个单词字符串包含到最终结果中 .
\w+ 匹配一个或多个单词字符.
\b 在单词边界处结束匹配.

 

下面的示例在正则表达式的末尾使用负预测先行断言定义, 以匹配不以标点字符结束的单词:

字符串: Disconnected, disjointed thoughts in a sentence fragment.

表达式: \b\w+\b(?!\p{P})

匹配结果(标志 3):
[0]disjointed
[1]thoughts
[2]in
[3]a
[4]sentence

表达式分析:

模式 说明
\b 在单词边界处开始匹配
\w+ 匹配一个或多个单词字符.
\b 在单词边界处结束匹配.
(?!\p{P}) 负预测先行断言. 如果下个字符不是一个标点符号(如句点或逗号)则匹配成功.
检查 \b\w+\b 匹配项的左侧 ( 前面 , 负预测 , )是否有 \p{P} 匹配的标点符号 :
如果 (?!\p{P}) 匹配成功 , 则最终匹配结果排除 \b\w+\b 的匹配项 ;
如果 (?!\p{P}) 匹配失败 , 则最终匹配结果包含 \b\w+\b 的匹配项 .

负预测先行断言匹配过程:

字符串: aa

one

bb
two
cc

表达式: <(?!/?p\b)[^>]+>

匹配结果(标志 3) : [0]

        [1]

这个正则的意义就是匹配除

或

之外的其余标签.

首先由字符 < 取得控制权, 从位置 0 开始匹配, 由于 < 匹配 " a " 失败, 在位置 0 处整个表达式匹配失败, 第一次迭代匹配失败, 正则引擎向前传动, 由位置 1 处开始尝试第二次迭代匹配. 重复前面过程, 直到位置 2, < 匹配成功, 控制权交给 (?!/?p\b) ;

断言模式 (?!/?p\b) 取得控制权后, 进行断言模式内部的匹配. 首先由 /?( 0 个或 1 个反斜杠 ) 取得控制权, 尝试匹配字符 p 失败, 进行不匹配回溯, 控制权交给 p 尝试匹配 p , 匹配成功, 控制权交给 \b 尝试匹配位置 4, 匹配成功. 此时断言模式 /?p\b 匹配成功, 那么负预测先行断言 (?!/?p\b) 就匹配失败. 在位置 2 处整个表达式匹配失败, 新一轮迭代匹配失败, 正则引擎向前传动, 由位置 3 处开始尝试下一轮迭代匹配.

在位置 8 处也会遇到一轮 /?p\b 匹配 /p 成功, 而导致负预测先行断言 (?!/?p\b) 匹配失败, 从而导致整个表达式匹配失败.

重复以上过程, 直到位置 14, < 匹配成功, 控制权交给 (?!/?p\b) ; /? 尝试匹配反斜杠 / 失败, 进行不匹配回溯, 控制权交给 p 尝试匹配 , 匹配失败, 已经没有备选状态可供回溯, 匹配失败. 此时断言模式匹配完成, /?p\b 匹配失败, 那么负预测先行断言 (?!/?p\b) 匹配成功. 匹配的结果是位置 15, 然后控制权交给 [^>]+ ; 由 [^>]+ 从位置 15 进行尝试匹配, 可以成功匹配到 div , 控制权交给 > 来匹配 > .

此时正则表达式匹配完成, 报告匹配成功. 匹配结果为

, 开始位置为 14, 结束位置为 19. 其中 < 匹配字符 < , (?!/?p\b) 匹配位置 15, [^>]+ 匹配字符串 div , > 匹配字符 > .





本文固定链接: http://elebm.com/post-221.html

blogger
该日志由 绿色风 于2016-3-30 19:27 Wednesday发表在 工具●教程 分类下。
版权所有:《绿色风's Blog》 → 《au3 正则参考 -64-负预测先行断言》;
除特别标注,本博客所有文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址;
本文标签:
et_highlighter51
上一篇::au3 正则参考 -70-回溯
下一篇:au3 正则参考 -63-负回顾后发断言

热门文章

  • 显示器亮度,对比度,色温缩放调节,笔记本亮度调节
  • 显示器 EDID 读取,生产日期和分辨率
  • 字符串打乱顺序
  • 简单的文本替换伪原则工具
  • Au3中仿高阶函数的使用示例

相关文章

  • au3 正则参考 -80-表达式的递归匹配
  • au3 正则参考 -01-工作方式
  • au3 正则参考 -13-数字字符
  • au3 正则参考 -71-回溯控制
  • au3 正则参考 -18-字符串头
取消回复

发表评论

亲,头像对么?

96 + 13 =

提交中,请稍候……


木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!


    站点统计
    • 日志总数: 302 篇
    • 评论数量: 91 条
    • 微语数量: 40 条
    • 附件总量: 305 件
  • 打赏"绿色风"



      扫码关注本站公众号 可搜本站内容

  • Autoit V3 脚本交流群

      常驻群1:477266297
      常驻群2:40672266


  • 标签

      QQ UDF IP 吐嘈 AU3 Enum 枚举常量 AU3小技巧 数组 进度条 对象 删除重复行 趣图 Hex 获取网络时间 swf UTC 日期 时间 POST 三目运算 三元判断 小技巧 GDI 收款 SQL 工具 映像 MV 劫持 API 教程 CHM 按键 GDI教程 杯举 按时间 笑一笑 2014 网络用语 2015 免费 元宵 视图 listview au3示例 美女 壁纸 游戏 差异加密 加密 串口 WebAPI IE TTS 环境yo 过去 验证码 图片分割 VBS HiFi Mp3 免费空间 QQchat 机器人 win10 电影 彩票 入门教程 帮助文档 事件 编码 CMD MD5 打赏 翻译 作品 下载 多线程 ListViewRead 赞助 鼠标 窗口尺寸 分享 汇编注入 干货 复制 移动 gizp 乐一乐 正则 autoit wav波形文件 播放 authcode 鼠标HOOK 键盘HOOK 剪切板 复制图片 文件遍历 JDK 网卡 GetAdaptersInfo 内存 CPU 转码
  • 链接

    • AU3中文论坛
    • 易捷博客
    • 简爱博客
    • 胡言乱语-小胡老师
    • 又淘气.我的世界
    • 御坂网络
    • 大师兄U盘装系统
    • 顺网小哥'S Blog
    • 猛牛哥的博客
    • 墨涩颓废网
  • 存档

    • 2019年9月(1)
    • 2019年8月(1)
    • 2019年5月(2)
    • 2019年4月(2)
    • 2019年3月(3)
    • 2019年2月(1)
    • 2018年11月(1)
    • 2018年10月(1)
    • 2018年9月(3)
    • 2018年8月(4)
    • 2018年4月(2)
    • 2018年3月(1)
    • 2018年1月(6)
    • 2017年12月(1)
    • 2017年11月(8)
    • 2017年7月(2)
    • 2017年6月(1)
    • 2017年5月(2)
    • 2017年4月(8)
    • 2017年3月(2)
    • 2017年2月(3)
    • 2017年1月(3)
    • 2016年12月(5)
    • 2016年11月(1)
    • 2016年10月(1)
    • 2016年9月(2)
    • 2016年8月(2)
    • 2016年7月(4)
    • 2016年6月(3)
    • 2016年5月(2)
    • 2016年4月(3)
    • 2016年3月(58)
    • 2016年1月(6)
    • 2015年12月(7)
    • 2015年11月(3)
    • 2015年10月(10)
    • 2015年9月(9)
    • 2015年8月(11)
    • 2015年7月(11)
    • 2015年6月(1)
    • 2015年5月(6)
    • 2015年4月(14)
    • 2015年3月(9)
    • 2015年2月(6)
    • 2015年1月(12)
    • 2014年12月(19)
    • 2014年11月(18)
    • 2014年10月(12)
Copyright © 2013 绿色风's Blog. Powered by emlog. Theme by 射雕天龙. 鄂ICP备15002104号-1 sitemap