使用元字符的Vim正则表达式

6

我有一个文本文件,其中包含以下内容:

This is some text for cv_1 for example
This is some text for cv_001 for example
This is some text for cv_15 for example

我正在尝试使用正则表达式cv_.*?\s来匹配文本中的cv_1cv_001cv_15。我知道这个正则表达式是有效的。然而,在Vim中尝试时,它没有匹配到任何内容。

我们需要在Vim中做些特殊的事情吗?


1
查看问题的简单方法是打开 :set incsearch。当输入问号时,您会看到搜索突然无法匹配。 - John Kugelman
2个回答

18

在Vim中,非贪婪字符?无法正常工作;你应该使用:

cv_.\{-}\s

...而不是:

cv_.*?\s

这是一个快速匹配参考:

     * (0 or more) greedy matching
    \+ (1 or more) greedy matching
  \{-} (0 or more) non-greedy matching
\{-n,} (at least n) non-greedy matching

%s/cv_.\{-}\ze\s/replacement/g - John Kugelman
2
\ze 结束匹配,使其在空格字符之前结束,以便不被替换。 - John Kugelman
1
这个很好用,为什么在vim中问号标记不起作用?这对我来说似乎很奇怪。 - Jacob Waller

5

Vim的正则表达式语法略有不同 -- 您需要寻找的是

cv_.\{-}\s

\{-} 是 vim 中等价于 perl 的 *?,即非贪心的 0 或多个。请参见 这里 了解有关 vim 正则表达式的好教程。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接