1

我正在使用 vim(7.3 版)。

在下一行

1xAxBx4

where AandB可以是任何字母数字字符,我想替换xBx4foo. 我尝试了以下替换命令

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

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

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

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

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

4

2 回答 2

1

虽然你正确使用了非贪心 \{-}量词,但因为之前没有消费,它仍然会从第一个开始匹配x,然后尽可能少地匹配。因为这行得通,所以没有回溯。

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

:s/.*\zsx.\{-}x4/foo/
于 2014-05-07T16:14:38.380 回答
0

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

x.\{-}x4例如你想替换是有意义的:

xAAAx4BBBx4CCCx4 -> ######BBBx4CCCx4

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

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

于 2014-05-07T16:08:57.553 回答