如何让 vim 中的匹配不贪婪?

问题描述 投票:0回答:8
regex vim regex-greedy
8个回答
885
投票

不要使用

.*
,而是使用
.\{-}

%s/style=".\{-}"//g

另外,请参阅

:help non-greedy


72
投票

vim 中的非贪婪搜索是使用 {-} 运算符完成的。像这样:

%s/style=".\{-}"//g

尝试一下:

:help non-greedy

49
投票

有什么问题

%s/style="[^"]*"//g

20
投票

如果您更熟悉 PCRE 正则表达式语法,那么

  1. 支持非贪婪运算符?,正如您在OP中所问的那样;和
  2. 不需要反向分组和基数运算符(这是完全违反直觉的 vim 语法要求,因为您不是匹配文字字符而是指定运算符);和
  3. 你已经用perl功能编译了[g]vim,使用测试

    :验证并检查功能;如果有 +perl 就可以了)

尝试使用

进行搜索/替换
:perldo s///

示例。交换 img 标签中的 src 和 alt 属性:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

14
投票

我发现此类问题的一个很好的解决方案是:

:%!sed ...

(如果您愿意,也可以使用 Perl)。 IOW,与其学习 vim 的正则表达式特性,不如使用您已经知道的工具。使用 perl 会使 ?修饰符可以使匹配变得不贪婪。


5
投票

\v
(根据几条评论中的建议)

:%s/\v(style|class)\=".{-}"//g

4
投票

插件 eregex.vim 处理 Perl 风格的非贪婪运算符

*?
+?


-3
投票

你好,

Vim 的正则表达式处理并不是太出色。我发现 sed 的正则表达式语法与 vim 的功能非常匹配。

我通常将搜索突出显示设置为(:set hlsearch),然后在输入斜杠进入搜索模式后使用正则表达式。

编辑:马克,Dale Dougherty 的优秀著作“Sed & Awk”(已清理的亚马逊链接)中也介绍了最小化贪婪匹配的技巧。

第三章“理解正则表达式语法”很好地介绍了 sed 和 awk 涉及的更原始的正则表达式功能。仅简短阅读,强烈推荐。

HTH

干杯,

© www.soinside.com 2019 - 2024. All rights reserved.