【问题标题】:vim non-greedy unexpected behaviorvim 非贪婪的意外行为
【发布时间】:2014-05-07 15:38:55
【问题描述】:

我正在使用 vim(7.3 版)。

在下一行

1xAxBx4

其中AB 可以是任何字母数字字符,我想将xBx4 替换为foo。我尝试了以下替换命令

:s/x.\{-}x4/foo/

得到1foo 而不是我所期望的(1xAfoo)。如果我使用这个替换命令,我可以得到1xAfoo

:s/x[^A]x4/foo/

但这太具体了,如果我想在多行上替换它就没有帮助,因为“A”可能是每一行的不同字符。

为什么\.{-} 会出现意外行为?或者这正是人们所期望的,但我只是误解了语法?

【问题讨论】:

  • 欢迎来到 Stack Overflow,第一个问题很好!我特别感谢您包含了所有步骤、预期结果和实际得到的结果,并通过包含您正在使用的 Vim 版本来完成这些!

标签: vim non-greedy


【解决方案1】:

虽然你已经正确使用了non-greedy\{-}量词,因为之前没有消费,所以还是会从第一个x开始匹配,然后尽量少匹配.因为这样行得通,所以没有回溯。

现在,您需要在表达式之前添加一个贪婪匹配,但不要使用这些字符。这可以通过\zs 来实现,让比赛只在之后开始:

:s/.*\zsx.\{-}x4/foo/

【讨论】:

    【解决方案2】:

    这不是“非贪婪”的用例。

    x.\{-}x4 将有意义,例如您要替换:

    xAAAx4BBBx4CCCx4 -> ######BBBx4CCCx4
    

    如果不使用\{-},结果将是######

    如果知道xx4之间只有一个字符,你就用x.x4或者如果你想避免空格被选中,用x\Sx4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-11
      • 2016-09-05
      • 1970-01-01
      • 2011-08-25
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多