如何使我的匹配在vim中非贪婪?

我有一个大的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似乎不喜欢?。不幸的是,删除?会使匹配过于贪婪。

如何让我的火柴不贪婪?

142935 次浏览

怎么了?

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

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

:%!sed ...

(或者perl,如果你喜欢)。低,与其学习vim的正则表达式特性,不如使用您已经知道的工具。使用perl将使?修改器工作,以取消贪婪的匹配。

喂!,

Vim的regexp处理不是很出色。我发现sed的regexp语法与vim的功能非常匹配。

我通常将搜索高亮设置为(:set hlsearch),然后在输入斜杠进入搜索模式后使用regexp。

Mark,最小化贪婪匹配的技巧也在Dale Dougherty的优秀著作《Sed &Awk”(# EYZ1)。

第三章“理解正则表达式语法”很好地介绍了sed和awk中涉及的更基本的regexp功能。只是一个简短的阅读,强烈推荐。

HTH

欢呼,

.\{-}代替.*

# EYZ0

另外,参见:help non-greedy

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

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

试试:

:help non-greedy

如果你对PCRE正则表达式语法更熟悉的话

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

    :对特征进行检查;如果+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>

使用\v(在一些评论中建议)

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

插件eregex.vim处理perl风格的非贪婪操作符*?+?