我该如何使我的比赛在vim中变得不贪心?


479

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

我该如何使比赛不愉快?


我认为保罗的答案很好。只是说“?” 并不意味着在vim中是可选的(如果这是您要使用“?”实现的目标)
LB40,2009年

14
@LB,以多种语言显示,。*?表示匹配任何字符但不贪心。那就是他想要达到的目标。
兰迪·莫里斯

Answers:


734

代替.*使用.\{-}

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

另外,请参阅 :help non-greedy


37
不是很直观,这是只有vim才能做到的吗?
Ehtesh Choudhury

94
一切都有自己的正则表达式语言……这是正则表达式最大的问题之一。
Patrick Farrell

35
这些工具中的许多大约在同一时间成熟,并且独立开发了自己的正则表达式语言。这些工具中的许多工具也都在尝试解决不同的问题,因此在这些实现之间语法可能(可能存在巨大差异)是有意义的。我们必须接受这就是现实世界的运作方式,尽管有时它会使我们作为开发人员的生活更加艰难。幸运的是,如今,许多工具至少提供了与Perl兼容的regex实现。不幸的是,Vim不是其中之一。
兰迪·莫里斯

15
如果像我这样的人将搜索默认为\v(非常神奇的标记),您将要使用.{-}
jgillman 2014年

48
@Shurane @Ziggy助记符:控制重复次数{1,3}(大括号)。减号的-意思是:重复的次数越少越好(little == minus);)
Ciro Santilli郝海东冠状病六四事件法轮功



17

如果您对PCRE regex语法比较满意,可以选择

  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>

1
perldo效果很好,但不幸的是在键入正则表达式时不会突出显示所选的测试。
mljrg

12

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

:%!sed ...

(如果愿意,也可以使用perl)。IOW不是使用vim的正则表达式特性,而是使用您已经知道的工具。使用perl会使?修改器工作以使匹配不满意。


2
好点,但能够做/pattern检查你申请,并在使用前正确地匹配模式c在你的vim的正则表达式修改也不错:)
若昂·波特拉

这是对的。这里的所有解决方案都不接近非贪婪的!如果必须在一行包含大量文本且多次出现该模式的行中匹配[0-9] \ {7},则此处没有解决方案。这里的解决方案仅适用于简单的事情(公平地说,就是要求的)。但是,如果您只需要搜索直到下一个报价单,vim就无济于事。
gcb

4

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

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


-4

G'day,

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

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

编辑:马克,Dale Dougherty的绝妙著作“ Sed&Awk”(经过消毒的Amazon链接)也介绍了最小化贪婪匹配的技巧。

第三章“了解正则表达式语法”是对sed和awk涉及的更原始的正则表达式功能的出色介绍。只有简短的阅读,强烈建议。

高温超导

干杯,


7
Vim的正则表达式处理实际上非常好。它可以做sed不能做的事情,例如在行/列号上进行匹配,或根据字符的每个语言分类(例如关键字,标识符或空格)进行匹配。它还具有零宽度的断言,并且能够将表达式放在替换的右侧。如果您使用\v它,则可以帮助清理语法。
布赖恩·卡珀

1
@Brian,加油。我将做一个正则表达式帮助,看看我所缺少的。
罗布·威尔斯

@ RobWells,Sed和Awk确实是一本非常不错的书,恕我直言,它没有在贪婪/懒惰的量词上花任何字。为了证明这一点,在本书中绝对没有出现贪婪贪婪这个词,只有一个无关紧要的出现是懒惰这个词。
Enrico Maria De Angelis

@EnricoMariaDeAngelis,但示例未明确引用该术语。它是关于如何定制正则表达式以使用“ not”运算符来实现非贪婪匹配的。Perl的NFA引擎引入了贪婪和懒惰一词,当时他们引入了运算符来专门修改贪婪匹配行为。
罗伯·威尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.