vim模式匹配两个令牌,中间没有另一个给定令牌

Mic*_*per 8 regex vim regex-negation

使用vim 7.2,对于本文:

foo foo token foo foo countertoken foo foo token foo target foo foo countertoken foo

我希望匹配以'token'开头并以'target'结尾的每个字符串,包含'countertoken'.

所以,在上面的例子中,我想匹配这个:

foo foo token foo foo countertoken foo foo token foo target foo foo countertoken foo

不是这个:

foo foo token foo foo countertoken foo foo token foo target foo foo countertoken foo

(原因是,在实践中,我正在搜索长文件,我对'target'之前的最后一个'token'感兴趣.令牌有点像XML标签,但它不是XML,所以XML工具没有帮助.我知道我可以使用,\zs所以光标落在'目标'上然后向后搜索'令牌',但肯定有一个一步的解决方案!)

我希望这样的东西可行,但它不会:

/token\(.*countertoken.*\)\@!*target
Run Code Online (Sandbox Code Playgroud)

我感兴趣的有很多这样的事件,当然,我正在搜索的文件并不像'foo'那样充满了常规.

在vim中是否有单行正则表达式?

jen*_*-na 1

如果您只对最后一个感兴趣token,则不必关心countertoken。一种可能性是查找最后一次出现的token并匹配所有内容直到下一次出现target

/.*\zs\(token\).\{-}\(target\)
Run Code Online (Sandbox Code Playgroud)

解释:

  • .*\zs- 匹配最后一次出现的情况。
  • \(token\)- 匹配字符串“token”
  • .\{-}非贪婪匹配
  • \(target\)- 匹配字符串“目标”