零宽断言就是zero-width,我觉得很难懂,但是搞清楚了其实很简单:

:echo matchstr(“abc1234def”, “\\v(abc)@<=(.{-})(def)@=”)

  比如上述例子是一个典型的零宽断言应用,要求是abc的后面,def的前面,需要结合两个零宽断言来写,正则表达式结构看起来复杂其实简单:

“(abc)@<=(.{-})(def)@=”

  可以分成三部分:

(abc)

  这是匹配前面的正则表达式,放在@<=前面,表示所要取得的字符串,是在能匹配这个正则表达式的部分的后面

(def)

  这是匹配后面的正则表达式,放在@=的前面,表示所要取得的字符串,是在能匹配这个正则表达式的部分的前面

(.{-})

  这就是我们要取得的字符串的正则表达式了,这里{-}是表示尽可能短的一个字符串,不是蛤总的一个眼镜框。

  额外说明一下,\\v是一个前缀,它表示这个字符串完全使用正则表达式,星号不是星号,是代表任意匹配,@<=也不是三个普通字符,而是代表前置零宽断言,因为在字符串里面,所以使用两个斜杠,如果在vim查找当中使用,只要一个就可以了 :/\v(abc)@<=(.{-})(def)@= ,会在1234那里匹配成功。

  也就是说,要写一个零宽断言,获取两个正则表达式之间的部分,可以分成 (表达式前)@<=(表达式)(表达式后)@=,表示取得“表达式前”和“表达式后”之间,能够匹配”表达式“的字符串。按照这个路数往上套就可以了。零否断言也一样原理。

原文来自我的教育网博客