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

时间:2012-12-14 02:10:31

标签: regex vim regex-negation

使用vim 7.2,本文:

  

foo foo 令牌 foo foo 反击 foo foo 令牌 foo 目标 foo foo countertoken foo

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

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

  

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

这个:

  

foo foo 令牌foo foo countertoken foo foo 令牌foo目标 foo foo countertoken foo

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

我希望这样的东西能起作用,但事实并非如此:

/token\(.*countertoken.*\)\@!*target

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

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

1 个答案:

答案 0 :(得分:1)

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

/.*\zs\(token\).\{-}\(target\)

说明:

  • .*\zs - 匹配上次出现。
  • \(token\) - 匹配字符串“token”
  • .\{-}匹配非贪婪的
  • \(target\) - 匹配字符串“target”