Vim 非贪婪意外行为
我正在使用vim(版本7.3) 下一行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.\{-
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版本来结束这一切!