au3 正则参考 -62-正回顾后发断言
<!DOCTYPE html>
正回顾后发断言: (?<=断言模式)
断言模式为任何正则表达式模式. 若要成功匹配, 则断言模式匹配项不得在输入字符串当前位置左侧出现, 尽管断言模式的匹配结果不会包含在最终匹配结果中.
断言模式为 0 宽度断言, 不会回溯. 回顾后发断言匹配时向左搜索断言模式.
正回顾后发断言通常在正则表达式的开头使用. 断言模式只是一个匹配的前提条件, 它不是匹配结果的一部分.
下面的示例匹配 21 世纪年份的最后两个数字(也就是说, 数字 20 要在匹配字符串之前).
字符串: 2010 1999 1861 2140 2009
表达式: (?<=\b20)\d{2}\b
匹配结果(标志 3) : [0]10 [1]09
表达式分析:
模式 | 说明 |
---|---|
\d{2} | 匹配两个十进制数字. 如果断言模式成功匹配, 则继续匹配 2 个数字 . |
(?<=\b20) | 正回顾后发断言. 如果两个十进制数字的左侧边界以 20 开头, 则匹配失败, 继续寻找匹配. 断言匹配条件 -- 匹配的字符串必须以 20 开头 . |
\b | 在单词边界处结束匹配. 如果 \d{2} 成功匹配 , 则在 \d{2} 的结束边界处结束匹配 . |
下面示例正则表达式 (UCP)(?<=\d){1,2}\s\w+,?\s\d{4} 使用回顾后发断言测试月份名称前面的日期; 然后该正则表达式匹配月份和年份
字符串: "1 五月 1917", "六月 16, 2003"
表达式: (UCP)(?<=\d){1,2}\s\w+,?\s\d{4}
匹配结果(标志 1, 或 2, 或 3): [0] 五月 1917
"六月 16, 2003" 因其开头不是十进制数字 , 所有不能匹配 .
表达式分析:
模式 | 说明 |
---|---|
(*UCP) | 启动 Unicode 类别属性(UCP)支持, 匹配中文字符串. |
(?<=\d) | 正回顾后发断言. 匹配项的开头必须为十进制数字. |
{1,2} | 匹配前项捕获值 1 到 2 次. |
\s | 匹配空白字符. |
w+,? | 匹配一个或多个单词字符. |
\s | 匹配空白字符. |
\d{4} | 匹配 4 个十进制数字. |
字符串 : Windows 2003
表达式 : (?<=Windows\s)\d+
匹配结果(标志 1, 或 2, 或 3) : [0]2003
说明 : \d+ 表示匹配一个以上的数字, 而 (?<=Windows\s) 相当于一个附加条件, 表示所在位置左侧必须为断言模式 Windows\s , 这个匹配的内容不计入匹配结果.
这个正则表达式在匹配字符串 Office 2003 时匹配失败, 因为这里任意一串数字子串的左侧都没有断言模式 Windows\s .
正回顾后发断言匹配过程
字符串 :
表达式 : (?<=
这个正则的意义就是匹配
匹配过程 :
1. 首先由正回顾后发断言 (?<= 2. 直到传动到位置 5, (?<= 3. 控制权交给正预测先行断言 (?= 此时正则表达式匹配成功完成. 匹配结果为 a test , 开始位置为 5, 结束位置为 11. 其中 (?<= 负回顾后发断言 (?<!断言表达式) 的匹配过程与上述过程类似, 区别只是当断言模式匹配失败时, 负回顾后发断言 (?<!断言表达式) 才匹配成功. 正回顾后发断言的特殊处在于, 它相当于在当前位置左侧附加一个条件, 所以它不是在当前位置开始尝试匹配的, 而是从当前位置左侧某一位置开始, 匹配到当前位置为止, 报告匹配成功或失败.
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!