关于正则表达式:如何在vim中使我的比赛不贪婪?

How can I make my match non greedy in vim?

我有一个大的HTML文件,它有很多标记,如下所示:

1
2
3
4
<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="",但我很难让匹配变得不整洁。

我的第一次尝试是

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

但是Vim似乎不喜欢?。不幸的是,删除?会使匹配变得过于贪婪。

我怎么才能让我的火柴不干净呢?


.\{-}代替.*

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

另见:help non-greedy


VIM中的非贪婪搜索是使用-运算符完成的。这样地:

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

试一试:

1
:help non-greedy


怎么了?

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


如果您更熟悉pcre regex语法,那么

  • 是否支持非贪婪运算符?,正如您在OP中所要求的;以及
  • 不需要backwhackgrouping和cardinality操作符(完全违反直觉的vim语法要求,因为您不匹配文字字符,而是指定操作符);以及
  • 您已经用Perl特性编译了[g]vim,使用

    :ver和inspect特性;如果有+perl,则可以使用)

  • 尝试使用搜索/替换

    1
    :perldo s///

    例子。交换img标记中的src和alt属性:

    1
    2
    3
    4
    5
    6
    7
    <p class="logo"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt="">
    </p>

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

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


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

    1
    :%!sed ...

    (如果您愿意,也可以使用Perl)。iow,而不是学习vim的regex特性,使用一个你已经知道的工具。使用Perl会使?修改器工作以取消匹配。


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


    \v一起(如几条评论中所建议的那样)

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

    G'Day.

    vim的regexp处理并不太出色。我发现sed的regexp语法与vim的功能完全匹配。

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

    编辑:马克,最小化贪婪匹配的技巧也在戴尔·杜赫蒂的优秀著作《SED&awk》(消毒的亚马逊链接)中有所介绍。

    第三章"理解正则表达式语法"是对与sed和awk有关的更原始的regexp功能的极好介绍。只有一个简短的阅读和强烈推荐。

    高温高压

    干杯,