正则表达式模式“{.*}”在 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
将这些从实际匹配中排除
我在 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
将这些从实际匹配中排除