我有一个很大的 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 似乎不喜欢 ?
。不幸的是,删除 ?
会使匹配过于贪婪。
我怎样才能让我的比赛变得不贪婪?
使用 .\{-}
代替 .*
。
%s/style=".\{-}"//g
另请参阅:help non-greedy
vim 中的非贪婪搜索是使用 {-} 运算符完成的。像这样:
%s/style=".\{-}"//g
试试看嘛:
:help non-greedy
有什么问题
%s/style="[^"]*"//g
如果您更熟悉 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
效果很好,但遗憾的是在输入正则表达式时没有突出显示选定的测试。
s/
那样使用 perldo
进行交互式正则表达式查找/替换。或者有可能吗?我很想错了。
我发现此类问题的一个很好的解决方案是:
:%!sed ...
(或 perl,如果您愿意)。 IOW,而不是学习 vim 的正则表达式特性,使用你已经知道的工具。使用 perl 会使 ?修饰符工作以使匹配不贪婪。
/pattern
以检查您是否正确匹配模式并在您的 vim 正则表达式中使用 c
修饰符也很好:)
使用 \v
(如多条评论中所建议)
:%s/\v(style|class)\=".{-}"//g
插件 eregex.vim 处理 Perl 风格的非贪心运算符 *?
和 +?
天,
Vim 的正则表达式处理不是很出色。我发现 sed 的正则表达式语法是关于 vim 功能的正确匹配。
我通常在 (:set hlsearch) 上设置搜索突出显示,然后在输入斜杠后使用正则表达式进入搜索模式。
编辑:马克,Dale Dougherty 的优秀著作“Sed & Awk”(sanitised Amazon link) 中也介绍了最小化贪婪匹配的技巧。
第三章“理解正则表达式语法”很好地介绍了 sed 和 awk 所涉及的更原始的正则表达式功能。只有一小段阅读,强烈推荐。
高温高压
干杯,
\v
它有助于清理语法很多。
\v
(非常神奇的标志),你会想要使用.{-}
。{1,3}
一样控制重复次数(大括号)。减号-
表示:尽可能少地重复(小 == 减号);)