ChatGPT解决这个技术问题 Extra ChatGPT

我怎样才能让我的比赛在 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 似乎不喜欢 ?。不幸的是,删除 ? 会使匹配过于贪婪。

我怎样才能让我的比赛变得不贪婪?

我认为保罗的回答很好。只是说“?”并不意味着在 vim 中是可选的(如果这是您想要使用“?”实现的)
@LB,在许多语言中,.*?表示匹配任何字符但不贪心。这就是他正在努力实现的目标。
相关:Vim SE 上的 How to make regex matchers non-greedy?
对于不知道非贪婪/非贪婪这个词的人:它也被称为懒惰

R
Randy Morris

使用 .\{-} 代替 .*

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

另请参阅:help non-greedy


不是很直观,这是只有vim才有的东西吗?
一切都有自己的正则表达式语言......这是正则表达式的最大问题之一。
许多这些工具大约在同一时间成熟,并独立开发了自己的正则表达式语言方言。其中许多工具还试图解决不同的问题,因此语法在这些实现中可能 - 可能非常不同 - 是有道理的。我们必须接受现实世界就是这样运作的,尽管它有时会让我们作为开发人员的生活更加艰难。幸运的是,如今许多工具至少提供了与 Perl 兼容的正则表达式实现。不幸的是,Vim 不是其中之一。
如果像我这样的人默认他们的搜索为 \v(非常神奇的标志),你会想要使用 .{-}
@Shurane @Ziggy Mnemonic:像 {1,3} 一样控制重复次数(大括号)。减号 - 表示:尽可能少地重复(小 == 减号);)
V
Vilhelm Gray

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

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

试试看嘛:

:help non-greedy

P
Paul Tomblin

有什么问题

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

虽然,为了我自己的利益,我仍然想更好地理解不贪婪的东西。
F
FrDarryl

如果您更熟悉 PCRE 正则表达式语法,

支持非贪婪运算符?,正如您在 OP 中所问的那样;并且不需要反向分组和基数运算符(一个完全违反直觉的 vim 语法要求,因为您不匹配文字字符而是指定运算符);并且您已经使用 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>

perldo 效果很好,但遗憾的是在输入正则表达式时没有突出显示选定的测试。
您不能像使用原生 vim 替代品 s/ 那样使用 perldo 进行交互式正则表达式查找/替换。或者有可能吗?我很想错了。
W
William Pursell

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

:%!sed ...

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


好点,但是能够在应用它之前执行 /pattern 以检查您是否正确匹配模式并在您的 vim 正则表达式中使用 c 修饰符也很好:)
这是对的。这里的所有解决方案都不是非贪婪的!如果您必须匹配 [0-9]\{7} 在一行中包含大量文本并且该模式多次出现,那么这里没有解决方案。这里的解决方案只适用于简单的事情(公平地说,这是所要求的)。但是如果你做的不仅仅是搜索到下一个引用,vim 将无济于事。
J
JJoao

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

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

b
bain

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


@xsilenT github.com/othree/eregex.vim:“建议使用 Vundle 或病原体安装脚本。”
抱歉,我不知道如何使用 Vundle 或病原体。
R
Rob Wells

天,

Vim 的正则表达式处理不是很出色。我发现 sed 的正则表达式语法是关于 vim 功能的正确匹配。

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

编辑:马克,Dale Dougherty 的优秀著作“Sed & Awk”(sanitised Amazon link) 中也介绍了最小化贪婪匹配的技巧。

第三章“理解正则表达式语法”很好地介绍了 sed 和 awk 所涉及的更原始的正则表达式功能。只有一小段阅读,强烈推荐。

高温高压

干杯,


Vim 的正则表达式处理实际上相当不错。它可以做 sed 不能做的事情,比如匹配行号/列号或基于每个语言的字符分类作为关键字或标识符或空格进行匹配。它还具有零宽度断言和将表达式放在替换右侧的能力。如果您使用 \v 它有助于清理语法很多。
@Brian,干杯。我会做一个帮助正则表达式,看看我错过了什么。
@RobWells, Sed & Awk 确实是一本非常好的书恕我直言,没有明确地在贪婪/懒惰的量词上花费任何文字。作为证明,书中绝对没有出现贪婪或贪婪这两个词,只有一个但不相关的懒惰一词出现。
@EnricoMariaDeAngelis 是,但该示例并未明确提及该术语。它是关于如何定制您的正则表达式以使用“非”运算符来实现非贪婪匹配。当 Perl 的 NFA 引擎引入运算符来专门修改贪婪匹配行为时,贪婪和懒惰的术语就出现了。