今天在用环视的时候碰到一个坑,记个笔记(诸如不支持逆序环视,甚至不支持环视的奇葩正则环境就不讨论了)。

先说结论吧:使用环视(管它叫断言也行)的时候,有一个隐含要求,正序环视只能作为正则表达式的结尾,逆序环视只能作为正则表达式的开头。

对照一个实例来看上面的结论:

待匹配字符串:a - 副本.rar
正则表达式1:.+(?=\.[^.]+)$
正则表达式2:.+(?=\.[^.]+$)
1的匹配结果是空,2的匹配结果是 a - 副本

环视最重要的特性之一就是:只进行匹配,不捕获结果,所以在写带环视的正则表达式的时候,需要将环视部分拿掉,把结果代回新的正则再进行一次验证,看是否满足才行。

* 拿掉环视部分以后,会得到一个更宽松的、不一定正确的、但一定需要满足的正则表达式

回头再看实例,正则1的环视匹配的是文件后缀名,但并不进行捕获,按上面的规则拿掉环视部分,会得到 .+$,看着好像没问题,但是把完整版本的临时结果代进.+就会发现一个问题:

由于匹配结果是文件名中不包含扩展名的那部分,一旦将结果代回来,新正则会变成”a – 副本$”,很显然匹配结果是false。
不过话说回来,一般在用环视的时候肯定都是放在开头或者结尾,不会故意放在中间,我这也是正好手滑打错字才碰到这个情况。