天天看点

正则表达式---零宽断言(五--概念)

在正则表达式---捕获和位置指定(四)中了解到了位置指定,其实位置指定就是零宽断言。

零宽断言:是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已。

javascript只支持零宽先行断言,而零宽先行断言又可以分为正向零宽先行断言,和负向零宽先行断言。

在零宽断言中我们将提及回溯这个概念,具体内容后面将会提及。

正向:

(?=exp) 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式。

(?<=exp) 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式。

负向:

(?!exp) 零宽度负预测先行断言,它断言此位置的后面不能匹配表达式。

(?<!exp) 零宽度负回顾后发断言,它断言此位置的前面不能匹配表达式。

实例代码1:

exp:abZW863;    正则:ab(?=[A-Z])

解释:作为正向预测先行断言,它判断自身出现的位置后面能匹配的表达式。样式abZW863中ab匹配了规则中的ab,接下来它开始预测样式abZW863中b后面的位置(因为a是0-1,b是1-2,所以预测2位置后面是否匹配规则),因为样式中b后面是Z,那么成功匹配规则[A-Z],但是注意这是断言,那么它是不会输出断言里匹配的内容,所以结果就是ab。我们用一句话概括这个规则就是:匹配以ab开头的后面任意一个大写字母的字符串

结果:ab

问题:当exp是ab1ZW863时,那么结果是多少呢?不会匹配任何东西。为什么?不应该至少会匹配到ab吗?因为a是0-1,b是1-2,1是2-3,所以当预测2位置后面时,发现1不匹配规则那么位置2则匹配失败,但是注意:2位置与1-2和2-3都有联系,所以处于1-2位置的样式b便无法匹配到,因为b匹配规则的失败,故而样式ab是无法成功匹配规则中的ab的,因此结果是无法匹配任何东西

正则表达式---零宽断言(五--概念)

实例代码2:

exp:abZW863;  正则:ab(?![A-Z])

解释:作为负向预测先行断言,它判断的是此位置后面不能匹配表达式。样式ab匹配规则中ab后,在2位置处判断后面不能匹配任何大写字母,结果样式2-3位置就是Z,那么无法匹配成功,2位置失效,同样样式b就无法匹配到规则中的b,自然样式ab匹配失败规则ab

结果:无匹配

正则表达式---零宽断言(五--概念)

参考资料:

1:http://blog.sina.com.cn/s/blog_12e4623a90101cqy0.html

2:https://www.jb51.net/article/95906.htm(请重点了解)

继续阅读