如何搜索和替换直到b的最后一场比赛?

时间:2015-06-16 12:56:01

标签: regex vim latex

我有一个乳胶文件,我希望摆脱\\之前的最后\end{quoting}

我正在处理的文件部分与此类似:

\myverse{some text \\
some more text \\}%
%
\myverse{again some text \\
this is my last line \\}%
\footnote{possibly some footnotes here}%
%
\end{quoting}

超过数百行,可能涵盖50个quoting环境。

我尝试使用:%s/\\\\}%\(\_.\{-}\)\\end{quoting}/}%\1\\end{quoting}/gc,但遗憾的是non-greedy量词\{-}仍然过于贪婪。 它从我的示例的第二行开始直到引用环境结束,我想贪婪的量词将赶上文件中的最后一个\end{quoting}。是否有可能通过搜索和替换来执行此操作,或者我应该为此编写宏吗?

编辑:我的预期输出看起来像这样:

this is my last line }%
\footnote{possibly some footnotes here}%
%
\end{quoting}

(我应该补充说,我现在已经通过编写一个小宏来解决了这个问题,但我还是很好奇,如果它也可以通过搜索和替换来完成。)

2 个答案:

答案 0 :(得分:2)

认为您要尝试匹配call adt -package %OPTIONS% %SIGNING_OPTIONS% -target bundle %OUTPUT% %APP_XML% %FILE_OR_DIR% 之前\\}%最后次,直到end{quoting} },在这种情况下你真的不想要任何字符(end{quoting}),你想要“任何不是\_.的字符”(是的,我知道这不是一个单个字符,但基本上就是这样。)

所以,简单地(哈!)改变你的模式,使用\\}%代替\%(\%(\\\\}%\)\@!\_.\)\{-};这意味着该模式不能包含多个\_.\{-}序列,从而实现您的目标(据我所知)。

这使用负零宽度前瞻模式\\}%来确保任何字符的下一个匹配限制为不匹配特定我们想要避免的文本(但除此之外,任何 else 仍然匹配)。请参阅:help / zero-width了解更多这些内容。

即。你的最终命令是:

\@!

(我注意到你的“预期”输出由于某种原因不包含前几行,它们是刚刚省略还是命令应该删除它们?)

答案 1 :(得分:1)

您使用非贪婪的 multi 走在正确的轨道上。 Vim帮助文件 说明,

  

" { - }"与" *"相同但使用最短匹配优先算法。

但是,下一行警告您遇到的问题。

  

但是:较早开始的比赛优先于较短的比赛:" a { - } b"比赛" aaab"在" xaaab"。

据我所知,您最好的解决方案是使用宏。