在正则表达式中有如下四种断言(也称零宽度断言、环视):
1 顺序肯定环视1.1 匹配指定内容的左侧位置1.2 匹配数字前的小写英文单词部分1.3 校验字符串长度2 顺序否定环视3 逆序肯定环视4 逆序否定环视
(?=Expression)
,顺序肯定环视,也称零宽度正先行断言。
(1)先行,表示待校验的位置在左边,即校验的位置在Expression
匹配的内容左侧。
(2)正,表示Expression
描述的规则,匹配的是校验位置右侧的内容。
由此可以看出,断言是一种描述位置的字符,它指定的是符合(?=Expression)
规则的位置。
正则表达式:(?=\d{3})
(?=\d{3})表示校验的位置右侧是三个数字,所以匹配到的是c和1之间的位置。
正则表达式:([a-z]+)(?=\d+)
(?=\d+) 表示校验的位置右侧是数字。
正则表达式:(?=^.{5}$)(.*)
(?=^.{5}$)表示校验的位置右侧字符串长度为5,因为加了字符串开头和结尾的字符,所以这个表达式的作用是匹配长度为5的字符串。
如果将正则表达式写成:(?=^.{5}$)
,则匹配的是长度为5的字符串,其左侧的位置。
由上面例子可以看出,断言的作用就是指定一个位置,该位置的左侧(或右侧)内容需要满足Expression规则。由此可以推测出其他三种断言的使用方式。
(?!Expression)
,顺序否定环视,表示校验位置右侧的内容不匹配Expression规则。
示例的正则表达式:(?!.*\d{3}.*)(^.*$)
(?!.*\d{3}.*)表示校验位置右侧的内容中不包含三个连续的数字。
(?<=Expression)
,逆序肯定环视,表示校验位置左侧的内容匹配Expression规则。
示例的正则表达式:(?<=\d{3})(.*$)
文本:abc123def
匹配到的内容:def
(?<=\d{3})表示校验位置左侧有三个连续的数字。这个表达式的作用是匹配三个连续数字右侧的内容。
((?<!Expression))
,逆序否定环视,表示校验位置左侧的内容不匹配Expression规则。
示例的正则表达式:(?<!\d{2})([a-z]+)
文本:123def
匹配到的内容:ef
(?<!\d{2}),表示校验位置左侧不是两个连续的数字。这个表达式的作用是匹配字符串部分内容,这部分内容左侧不是两个连续的数字。
值得一提的是,VBA中通常使用的是VBScript正则(vbscript.regexp
),不支持逆序环视。
参考资料:
[1] VBA之正则表达式(9)-- 添加千分位(1/3)(https://blog.csdn.net/taller_2000/article/details/89784517)
[2] 正则表达式在线测试 | 菜鸟工具 (runoob.com)(https://c.runoob.com/front-end/854/?optionGlobl=global)
[3] 正则表达式(二):断言(/developer/article/1337736)