如何在vim中让我的比赛不贪婪?

时间:2009-08-20 12:28:18

标签: regex vim regex-greedy

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

如何才能使我的比赛不合适?

8 个答案:

答案 0 :(得分:700)

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

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

另请参阅:help non-greedy

答案 1 :(得分:53)

使用{ - }运算符在vim中进行非贪婪搜索。像这样:

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

试试:

:help non-greedy

答案 2 :(得分:47)

有什么问题
%s/style="[^"]*"//g

答案 3 :(得分:15)

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

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

    进行测试

    :检查和检查功能;如果+ perl在那里你很高兴去)

  4. 尝试使用

    进行搜索/替换
    :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>
    

答案 4 :(得分:11)

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

:%!sed ...

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

答案 5 :(得分:1)

使用\v(如多条评论中所述)

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

答案 6 :(得分:1)

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

答案 7 :(得分:-4)

天儿真好,

Vim的正则表达式处理并不太棒。我发现sed的regexp语法与vim的功能正确匹配。

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

编辑:Mark,Dale Dougherty的优秀着作“Sed&amp; Awk”(sanitised Amazon link)也涵盖了减少贪婪匹配的技巧。

第三章“理解正则表达式语法”是sed和awk所涉及的更原始的正则表达式功能的优秀介绍。只是简短的阅读和强烈推荐。

HTH

欢呼声,