Vim搜索通配符匹配第一次出现

19

我有一个文件,里面包含以下代码:

<a href="blah.com" rel="blahblah" style="textdecoration:none;">blah</a>

我想匹配 rel="blahblah"

但是当我使用 \rel=".*" 进行匹配时,它会匹配 rel="blahblah" style="textdecoration:none;"

我尝试过 rel=".*\{-\}",但会出现错误 nested \{

4个回答

37

你可以使用:

rel=".\{-}"

\{-}在VIM中用于非贪婪匹配


1
这非常有用,当我不想匹配最长的字符串而是第一个字符串时。非常感谢! - jtony

5
尝试使用[^"]代替.。后者是“贪婪的”,会匹配尽可能多的字符。
在正则表达式中,[d-r13579]用于匹配“字符类”:在这种情况下,它可以匹配从dr之间的任何小写字母或奇数数字。如果您以^开头,则表示否定其含义。
因此,[^"]表示除双引号外的任何字符,而"[^"]*"表示两个双引号之间有任意数量的任意字符,但不包括双引号。

你能详细说明一下吗?我尝试了/rel="[^"],但只返回了rel="b - mazlix
@mazlix 我的意思是 /rel="[^"]*"。你需要星号来匹配引号中的所有内容。 - bandi
哦,那么 [^"] 到底是做什么的?我以为里面的 " 是表示我正在寻找一个闭合的 " - mazlix
@mazlix,我已经在答案中添加了解释。 - bandi

4

默认情况下,正则表达式匹配器是贪婪的。

  s/rel=".\{-}"/aaaaaaa/

对我来说有效

{-} 表示短路表达式,以匹配最短的模式。


它说找不到模式,如果我转义问号?,则会显示嵌套的 \?/rel=".*\?" - mazlix
非常抱歉,我在意识到vi使用另一种语法之前首先使用了perl语法。我又学到了新的东西,谢谢。 - Peter Tillemans

0

我发现使用\{-}很困惑,所以在这种情况下,我通常会选择像/rel="[^"]*"这样的东西。


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