我在Vim中打开了一行文本文件:
a{b} {c}
我想匹配花括号括起来的字符串。如果我的光标位于文件的第1行第1行,我就
:call search('{.*}', 'W')
光标将转到第一个' {'在角色' a'之后。
但如果我重复搜索,光标就不会转到第二个' {'这是在' b'之间和' c'和echo search('{.*}', 'W')
返回0。
为什么?
编辑:让我来解答@romainl的答案我理解*
是贪婪的,我可以先匹配{b} {c}
。
但是,当光标位于第一个{
之下时,模式应该仍然能够匹配{c}
,因为{c}
位于光标之后并且与模式一致。
答案 0 :(得分:2)
romainl是对的,当使用search()时,vim显然不会忽略光标前的字符。
如果您仍想在大括号内使用贪婪的操作符,则可以执行此操作
echo search('\m\%#.\{-1,}\zs{.*}', 'W')
\%#
仅在光标位置后匹配,.\{-1,}
确保我们匹配第一个之后的任何内容{如果我们在其上,\zs
从实际匹配中排除这些
答案 1 :(得分:1)
*
贪婪,它会匹配尽可能多的前一个模式的实例。这意味着{.*}
将与此匹配:
a{b} {c}
^^^^^^^
而不是所需的:
a{b} {c}
^^^
您应该使用非贪婪的模式,例如\{-}
:
{.\{-}}
将匹配:
a{b} {c}
^^^
和
a{b} {c}
^^^
下次通话。
尝试查找正确的搜索模式时,通常在'incsearch'
打开的命令行上执行此操作非常有用。尝试使用原始模式,您将立即看到错误。
请参阅:help pattern-multi-items
和:help \{
。