总体概述
目标是匹配所有\foo
出现的内容,将其转换为<p>content of \foo</p>
。
详情
我们的目标是匹配一些LaTeX宏的内容,从它的开始括号到结束括号。
但是,这样一来,可能会出现两个问题。使用greedy,如果它们是在同一行结束的宏之后的一个右括号,如lorem ipsum \foo{dolor} sit amet et consectetur \bar{}
,那么s/\\foo{.*}/\1/
将匹配dolor} sit amet et consectetur \bar{}
。
但是,使用non-greedy,我可以匹配\\foo
中第二个宏的右括号。例如,lorem ipsum \foo{dolor \bar{sit amet} et consecteur} quia adipt
与s/\\foo{.\{-}}/\1/
将匹配dolor \bar{sit amet
。
在小的和贪婪的情况下,我都不能匹配宏内容,只能匹配宏内容。
问题
那么,如何将宏内容从左括号匹配到相应的右括号呢?
备选问题:我使用sed是不是错了,然后我应该使用一个更专用的LaTeX解析工具吗?
2条答案
按热度按时间svdrlsy41#
perl通过包Text::Balanced提供此功能
我使用perl修复了以下形式的Latex输出:
发件人:
收件人:
其产生:
代码如下:
注解行用于调试代码。以下链接介绍了该软件包:
https://metacpan.org/pod/Text::Balanced
gwo2fgha2#
sed有时可以通过使用一个技巧来使用,即使用以第一个括号开始的正则表达式,然后包括尽可能多的不是结束括号的字符,例如“{[^}]*”。但是找到匹配的括号可能是一个问题。如果在这个问题中:
Remove all occurrence of a command, preserving command argument
如果匹配的方括号后面跟着一个空格,或者其他字符,sed可以工作。