正则表达式---零宽断言(五--负向零宽断言)

负向零宽断言:

(?!exp)     零宽度负预测先行断言;  匹配后面不是exp的位置

(?<!exp)   零宽度负回顾后发断言;  匹配前面不是exp的位置

代码示例1:

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

图示:

思考:该正则规则会匹配到该exp哪些结果?是ab还是ab88亦或是ab ab88呢?

分析:首先正则中a来获取控制权,接着开始从第0号位置去匹配。exp中的a是0-1位置,恰好匹配成功,控制权转到正则的b中。此时b会去从第一号位置匹配。exp中的b是1-2位置,恰好匹配成功,接着将控制权转给正则的(?![A-Z])中。此时(?![A-Z])会去匹配第二位置,但是它要求第二位置后面不能是A-Z,那么匹配位置失败,接着将控制权重新发送回正则的a中。...接着到了第7号位置,正则a匹配exp的a成功...最后到了第九号位置,控制权此时是(?![A-Z])。(?![A-Z])开始从第九号位置去匹配,发现8不是A-Z,那么匹配成功,注意:断言匹配的内容不会具有真实性,换句话说断言匹配到这里的8后,发现匹配成功了,那么说明第九号位置它匹配到了,所以一直强调断言匹配的是位置不是内容由于匹配成功,那么会回到第九号位置,但是该正则此时结束了当前的生命周期,那么匹配结果就出来了,如果后面还有内容则规则继续从a开始,从第九号位置开始依次进行。所以结果就是ab,不是第一个ab,是最后一个ab。

结果:

代码示例2:

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

思考:匹配的结果是第一个ab还是第二个ab还是ab  ab呢?

分析:不再分析前面,在exp中Z和a之间是第六号位置,(?<![A-Z])此时的控制权发现第六号位置前面是Z,那么匹配第六号位置失败,对于a来说是6-7位置,六号位置的失效表示:当正则控制权转到a时,因为六号位置的失效导致匹配exp中的a失败进而匹配后面的b也失败。

结果:

 问题:exp:reading a book.     reg:\b(?=re)\w+\b  匹配结果是什么?是ading?还是reading?

答案:是reading。在https://www.jb51.net/article/95906.htm这里,它提到结果是ading,现在应该是写错了。具体原因已经在上面讲清楚了的。(PS:匹配位置然后成功就回溯到匹配的位置)

猜你喜欢

转载自blog.csdn.net/qq_40258437/article/details/88383086