524

我有一个很大的 HTML 文件,其中包含很多如下所示的标记:

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

我正在尝试进行 Vim 搜索和替换以摆脱所有内容class=""style=""但我无法使匹配变得不贪心。

我的第一次尝试是这个

%s/style=".*?"//g

但 Vim 似乎不喜欢?. 不幸的是,删除?会使比赛过于贪婪。

我怎样才能让我的比赛变得不贪婪?

4

8 回答 8

803

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

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

另见:help non-greedy

于 2009-08-20T12:45:49.967 回答
62

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

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

你试一试:

:help non-greedy
于 2009-08-20T12:45:58.140 回答
48

有什么问题

%s/style="[^"]*"//g
于 2009-08-20T12:30:22.410 回答
17

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

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

    :ver 和检查功能;如果 +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>
于 2012-11-20T15:23:47.313 回答
13

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

:%!sed ...

(或 perl,如果您愿意)。IOW,而不是学习 vim 的正则表达式特性,使用你已经知道的工具。使用 perl 会使 ? 修饰符工作以使匹配不贪婪。

于 2009-08-20T12:39:45.817 回答
5

\v(如几条评论中所建议)

:%s/\v(style|class)\=".{-}"//g
于 2015-09-29T11:25:50.720 回答
4

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

于 2016-11-09T00:06:39.240 回答
-3

天,

Vim 的正则表达式处理不是很出色。我发现 sed 的正则表达式语法是关于 vim 功能的正确匹配。

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

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

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

高温高压

干杯,

于 2009-08-20T12:42:22.773 回答