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

A regex pattern '{.*}' does not work in Vim as (I) expected

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

a{b} {c}

我想匹配花括号括起来的字符串。如果我的光标位于文件的第 1 列第 1 行,并且我这样做

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

光标将转到字符 'a' 之后的第一个 '{'。

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

为什么?

编辑:让我回答@romainl

我明白*是贪心的,我先匹配{b} {c}就OK了

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

* 是贪心的,它将匹配 尽可能多的 先前模式的实例。这意味着 {.*} 将匹配:

a{b} {c}
 ^^^^^^^

而不是所需的:

a{b} {c}
 ^^^

你应该使用像 \{-} 这样的非贪婪模式:

{.\{-}}

将匹配:

a{b} {c}
 ^^^

和:

a{b} {c}
     ^^^

下次通话时。

当试图找到正确的搜索模式时,在启用 'incsearch' 的命令行上这样做通常很有用。用你原来的模式试一试,你马上就会发现问题所在。

参见 :help pattern-multi-items:help \{

romainl 是对的,vim 显然在使用 search() 时不会忽略光标前的字符。

如果你仍然想在大括号内使用贪心运算符,你可以这样做

echo search('\m\%#.\{-1,}\zs{.*}', 'W')

\%# 仅在光标位置之后匹配,.\{-1,} 确保我们匹配第一个之后的任何内容 { 如果我们在上面,\zs 将这些从实际匹配中排除