【问题标题】:vim pattern matching two tokens without another given token inbetweenvim 模式匹配两个标记,中间没有另一个给定标记
【发布时间】:2012-12-16 12:17:10
【问题描述】:

使用 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 中是否有单行正则表达式?

【问题讨论】:

    标签: regex vim regex-negation


    【解决方案1】:

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

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

    解释:

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

    【讨论】:

    • 谢谢,但这并没有考虑到最后一次出现可能包括“countertoken”。我意识到我应该澄清一下:我感兴趣的字符串在文件中多次出现,其中任何一个可能包含也可能不包含 countertoken — 当它们不包含时我感兴趣。我已经编辑了问题。
    猜你喜欢
    • 2016-05-10
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2015-04-08
    • 2013-04-04
    • 2011-02-26
    相关资源
    最近更新 更多