正则表达式模式' {。*}'在Vim中不起作用(I)预期

时间:2015-01-17 10:12:57

标签: regex vim

我在Vim中打开了一行文本文件:

a{b} {c}

我想匹配花括号括起来的字符串。如果我的光标位于文件的第1行第1行,我就

:call search('{.*}', 'W')

光标将转到第一个' {'在角色' a'之后。

但如果我重复搜索,光标就不会转到第二个' {'这是在' b'之间和' c'和echo search('{.*}', 'W')返回0。

为什么?

编辑:让我来解答@romainl的答案

我理解*是贪婪的,我可以先匹配{b} {c}

但是,当光标位于第一个{之下时,模式应该仍然能够匹配{c},因为{c}位于光标之后并且与模式一致。

2 个答案:

答案 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 \{