vim非贪婪的意外行为

时间:2014-05-07 15:38:55

标签: vim non-greedy

我正在使用vim(版本7.3)。

在以下一行

1xAxBx4

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

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

并获取1foo而不是我期望的1xAfoo)。如果我使用此替换命令

,我可以获得1xAfoo

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

但是这太具体了,如果我想要在多行上替换,那将无济于事,因为" A"在每一行上可能是一个不同的角色。

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

2 个答案:

答案 0 :(得分:1)

虽然您已经正确使用了非贪婪 \{-}量词,但由于之前没有消费,它仍然会在第一个{{1然后,尽可能少地匹配。因为这有效,所以没有回溯。

现在,您需要在表达式之前添加一个贪婪的匹配,但不要使用这些字符。这可以通过x实现,以便仅在之后开始匹配:

\zs

答案 1 :(得分:0)

这不是"非贪婪"

的用例

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

xAAAx4BBBx4CCCx4 -> ######BBBx4CCCx4

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

如果知道xx4之间只有一个字符,您只需使用x.x4,或者如果您想避免选择空格,请使用x\Sx4