Vim 非贪婪意外行为

Vim 非贪婪意外行为,vim,non-greedy,Vim,Non Greedy,我正在使用vim(版本7.3) 下一行 1xAxBx4 如果A和B可以是任何字母数字字符,我想用foo替换xBx4。我尝试了以下替换命令 :s/x.\{-}x4/foo/ 然后得到1foo而不是我所期望的(1xAfoo)。如果使用此替换命令,我可以获得1xAfoo :s/x[^A]x4/foo/ 但这太具体了,如果我想在多行上替换,这将没有帮助,因为“A”可能在每行上都是不同的字符 为什么使用\.{-}会出现意外行为?或者这正是人们所期望的,但我只是误解了语法?这不是“非贪婪”的用例 x.\{-

我正在使用vim(版本7.3)

下一行

1xAxBx4

如果
A
B
可以是任何字母数字字符,我想用
foo
替换
xBx4
。我尝试了以下替换命令

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

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

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

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


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

这不是“非贪婪”的用例

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

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


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

,尽管您已经正确使用了非贪婪的
\{-}
量词,因为之前没有消耗,它仍将在第一个
x
处开始匹配,然后尽可能少地匹配。因为这是有效的,所以没有回溯

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

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

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