regex 通过sed解析乳胶宏

hgncfbus  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

总体概述

目标是匹配所有\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 adipts/\\foo{.\{-}}/\1/将匹配dolor \bar{sit amet
在小的和贪婪的情况下,我都不能匹配宏内容,只能匹配宏内容。
问题
那么,如何将宏内容从左括号匹配到相应的右括号呢?
备选问题:我使用sed是不是错了,然后我应该使用一个更专用的LaTeX解析工具吗?

svdrlsy4

svdrlsy41#

perl通过包Text::Balanced提供此功能
我使用perl修复了以下形式的Latex输出:
发件人:

\noindent {\tt// substitute into diffEQ }
\begin{dmath} \label{eq:3}
b \frac{d^{}\left(\text{a*(1-exp(-c*t))}\right)}{\mathrm{dt^{}}}+k a \left(1-\mathrm{e}^{-c t}\right)=F
\end{dmath}

收件人:

\noindent {\tt// substitute into diffEQ }
\begin{dmath} \label{eq:3}
b \frac{d^{}\left({a (1-\mathrm{e}^{-c t})}\right)}{\mathrm{dt^{}}}+k a \left(1-\mathrm{e}^{-c t}\right)=F
\end{dmath}

其产生:

代码如下:

perl -MText::Balanced -MData::Dumper -nlE '
    @brac = Text::Balanced::extract_bracketed($_, "{}", "^.*\\\\left\\(\\\\text");
    while ( defined(@brac[0]) ) {
#if(defined(@brac[0])) { print Data::Dumper::Dumper(\@brac)."\n" };
#print @brac[2], @brac[0], @brac[1];
    if(defined(@brac[0])) { modify_exp() };
    $_ = @brac[2] . @brac[0] . @brac[1];
    @brac = Text::Balanced::extract_bracketed($_, "{}", "^.*\\\\left\\(\\\\text");
    };
    print $_;

sub modify_exp {
    $brac[0] =~ s/\*/ /g;
    my @sub_brac = Text::Balanced::extract_bracketed($brac[0], "()", "^.*exp");
#print Data::Dumper::Dumper(\@sub_brac)."\n" ;
    $sub_brac[0] =~ s/\((.*)\)$/\\mathrm{e}^{$1}/g;
    $sub_brac[2] =~ s/exp//;
    $brac[0] = @sub_brac[2] . @sub_brac[0] . @sub_brac[1];
#print $brac[0];
#   $brac[0] =~ s/^{//;
#   $brac[0] =~ s/}$//;
    $brac[2] =~ s/\\text$//;
}
' "$1"

注解行用于调试代码。以下链接介绍了该软件包:
https://metacpan.org/pod/Text::Balanced

gwo2fgha

gwo2fgha2#

sed有时可以通过使用一个技巧来使用,即使用以第一个括号开始的正则表达式,然后包括尽可能多的不是结束括号的字符,例如“{[^}]*”。但是找到匹配的括号可能是一个问题。如果在这个问题中:
Remove all occurrence of a command, preserving command argument
如果匹配的方括号后面跟着一个空格,或者其他字符,sed可以工作。

相关问题