au3 正则参考 -61-正预测先行断言
<!DOCTYPE html>
正预测先行断言: (?=断言模式)
子表达式为任何正则表达式模式. 若要成功匹配, 则输入字符串必须存在能匹配断言模式的子字符串, 尽管匹配的子字符串不会包含到匹配结果中.
零宽正预测先行断言不会回溯. 匹配时向右搜索断言模式.
通常零宽正预测先行断言是在正则表达式模式的末尾找到的. 它定义一个子字符串, 该子字符串必须出现在匹配字符串的末尾但又不能包含在匹配结果中.
零宽正预测先行断言能确保特定捕获组从与断言模式匹配的文本开始开始捕获.
对于 (?=断言模式) 来说, 当断言模式匹配成功时, (?=断言模式) 匹配成功, 但这个匹配不会包含在最终匹配结果中!
通常正预测先行断言定义在正则表达式模式的末尾. 它定义一个断言子字符串, 该子字符串必须出现在匹配字符串的后面但又不能包含在匹配结果中. 这有助于防止过度回溯.
正预测先行断言功能允许回溯引擎在匹配断言模式后返回到文本中相同的作用点. 这对于通过验证起始于相同位置的多个模式搜索整个文本是很有用的. 它还允许引擎验证匹配的结尾是否存在某个子字符串, 而无需在匹配的文本中包含该子字符串. 下面的示例使用正预测先行从句子中提取未后无标点符号的单词.
字符串: If so, what comes next?
表达式: (?i)\b[A-Z]+\b(?=\P{P})
匹配结果: [0]=If [1]what [2]comes
表达式分析:
模式 | |
---|---|
(?i) | 从此处开始, 匹配不区分大小写. |
\b | 在单词边界处开始匹配. |
[A-Z]+ | 不区分大小写与任意字母字符匹配一次或多次. |
\b | 在单词边界处结束匹配. |
(?=\P{P}) | 查看前一个字符来确定下一个字符是否为标点符号. 如果不是, 则表明匹配成功. |
下面示例匹配输入字符串中谓词 is 前面的单词:
字符串:
The dog is a Malamute.
The island has beautiful birds.
The pitch missed home plate.
Sunday is a weekend day.
表达式: \b\w+(?=\sis\b)
匹配结果(标志 3):
[0]dog 单词 is 前面的单词
[1]Sunday 单词 is 前面的单词
' The island has beautiful birds. ' 与 ' The pitch missed home plate. ' 中的 is 后面没有空格, 都不是单词, 因此都不匹配这个正则表达式 .
表达式分析:
模式 | 说明 |
---|---|
\b | 在单词边界处开始匹配. |
\w+ | 匹配一个或多个单词字符 . |
(?=\sis\b) | 正预测先行断言. 确定单词结束的后面是否有空白字符并紧跟单词字符串 is . 如果是, 则该单词匹配成功. 断言模式指定这样一个条件 : 空白符 \s 后跟 2 个字母 is 再后跟单词边界 \b . \w+ 匹配到一个单词后 , 立即从当前单词的结束位置顺序向前检查该单词其后是否有一个匹配断言模式的字符串 is , 如果有 , 则匹配成功 , 并将这个单词保存到最终匹配结果中 , 但不保存匹配断言模式的字符串 is , 否则匹配失败 . |
匹配过程分析
字符串 : a12
表达式 : ^(?=[a-z])[a-z0-9]+$
匹配结果(标志 1 或 2 或 3) : [0]a12
元字符 ^ 和 $ 匹配的只是位置, 正预测先行断言 (?=[a-z]) 只进行匹配, 并不占有字符, 也不将匹配的内容保存到最终的匹配结果, 所以都是零宽度的.
1. 首先由元字符 ^ 取得控制权, 从位置 0 开始匹配. ^ 匹配的就是开始位置 0 , 匹配成功后控制权交给正预测先行断言 (?=[a-z]).
2. 正预测先行断言 (?=[a-z]) 要求它所在位置左侧(后面)必须是一个字母才能匹配成功, 0 宽度的断言模式之间是不互斥的, 即同一个位置可以同时由多个 0 宽度断言模式匹配, 所以它也是从位置 0 尝试进行匹配, 位置 0 的右侧是字符 a , 符合要求, 匹配成功, 控制权交给 [a-z0-9]+.
3. 因为 (?=[a-z]) 只进行匹配, 并不将匹配到的内容保存到最后结果, 并且匹配成功的只是位置 0, 所以 [a-z0-9]+ 也是从位置 0 开始尝试匹配的, [a-z0-9]+ 首先尝试匹配 a , 匹配成功, 继续尝试匹配, 可以成功匹配接下来的 1 和 2 , 此时已经匹配到位置 3, 位置 3 的右侧已没有字符, 这时会把控制权交给 $.
元字符 $ 从位置 3 开始尝试匹配, 它匹配的是结束位置, 也就是位置 3 , 匹配成功.
此时正则表达式匹配完成, 报告匹配成功. 匹配结果为 a12 , 开始位置为 0, 结束位置为 3. 其中 ^ 匹配位置 0, (?=[a-z]) 匹配位置 0, [a-z0-9]+ 匹配字符串 a12 , $ 匹配位置 3.
注意 : 这里的正预测先行断言 (?=[a-z]) 定义在整体表达式的开头 , 而上面示例是将断言模式 (?=\sis\b) 定义在正则表达式的末尾 !
发表评论
木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!