我怎样才能让我的比赛在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的search和replace来摆脱所有class=""style=""但我很难使这场比赛不太成功。

我第一次尝试是这样的

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

但Vim似乎并不喜欢这个? 。 不幸的是删除? 使比赛过于贪婪。

我怎样才能让我的比赛不懂?

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

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

另外,请参阅:help non-greedy

vim中的非贪婪search是使用{ – }运算符完成的。 喜欢这个:

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

你试一试:

 :help non-greedy 

怎么了

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

如果你更喜欢PCRE正则expression式的语法,

  1. 支持非贪婪的操作符? 和
  2. 不需要反冲分组和基数运算符(由于你不匹配文字字符而是指定运算符),所以完全违反了vim的语法要求; 和
  3. 你有[g] vim编译perlfunction,testing使用

    :ver和检查function; 如果+ perl在那里,你很好走)

尝试使用search/replace

 :perldo s/// 

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

 <p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/caminohttp://img.dovov.comheader_logo.png" alt=""></a></p> :perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/ <p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/caminohttp://img.dovov.comheader_logo.png"></a></p> 

我发现这种types的问题的一个很好的解决scheme是:

 :%!sed ...

(或perl,如果你喜欢)。 IOW,而不是学习vim的正则expression式的特性,使用你已经知道的工具。 使用Perl会使? 修饰符的工作,以validation比赛。

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

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

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

天儿真好,

Vim的正则expression式处理并不太精彩。 我发现sed的regexp语法是关于vimfunction的正确匹配。

我通常在(:set hlsearch)上设置search高亮显示,然后在input斜杠后用正则expression式进入search模式。

编辑:马克,最小化贪婪匹配的诀窍也包括在Dale Dougherty的优秀着作“Sed&Awk”( 消毒的亚马逊链接 )中。

第三章“理解正则expression式语法”是介绍sed和awk更为原始的正则expression式能力的一个很好的介绍。 只有一个简短的阅读和强烈推荐。

HTH

干杯,