8

对于此文本,使用 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

(这样做的原因是,实际上,我正在搜索长文件,并且我对“目标”之前的最后一个“令牌”感兴趣。令牌有点像 XML 标记,但它不是 XML,所以 XML工具无济于事。我知道我可以使用\zs这样光标落在“目标”上,然后向后搜索“令牌”,但肯定有一个一步的解决方案!)

我希望这样的事情会起作用,但它没有:

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

有很多这样的事件我感兴趣,当然,我正在搜索的文件并没有像“foo”这样常规的东西。

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

4

1 回答 1

1

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

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

解释:

  • .*\zs- 匹配最后一次出现。
  • \(token\)- 匹配字符串“令牌”
  • .\{-}匹配非贪婪
  • \(target\)- 匹配字符串“目标”
于 2012-12-14T09:36:13.820 回答