【发布时间】:2016-01-19 18:06:18
【问题描述】:
我想将 \eqalign{...} 替换为 \begin{align*} ... \endalign*} 以获取以下文本:
$$\eqalign{&\cases{\mathdot{\bf x}=A{\bf x}+Bu\cr y=H{\bf x}}\quad{\rm with}\ {\bf x}=\left(\matrix{x\cr\mathdot{x}\cr\theta\cr\mathdot{\theta}}\right),\cr&A\!=\!\!\left(\matrix{0&1&0&0\cr 0&0&-{m_{a}\over M}g&0\cr 0&0&0&1\cr 0&0&{(M\!+\!m_{a})\over Ml}g&0}\right)\!,\ B\!=\!\left(\matrix{0\cr{a\over M}\cr 0\cr-{a\over Ml}}\right)\!,\ H^{T}\!=\!\left(\matrix{1\cr 0\cr 1\cr 0}\right)\!.}$$
Perl 编码
my $CurBrLoopMany = qw/((?:[^{}]*(?:{(?:[^{}]*(?:{[^{}]*})*[^{}]*)*})*[^{}]*)*)/;
$inxmlstr=~s/\\eqalign\{($CurBrLoopMany)\}/\\begin{align*}$1\\end\{align*}/gs;
但是我无法替换嵌套的大括号列表(方括号、花括号、括号)。
有人可以吗?
【问题讨论】:
-
在给定的情况下,您可以轻松地匹配行开始/结束
$$并且解决方案很简单。反过来,在一般情况下,您会遇到无法用正则表达式解析的 irregular 语言。但是,Perl 的正则表达式允许您通过它的扩展 来做这样的事情。查看here 的示例,您可以但可能不应该如何做到这一点。 -
你说的是
qw//,这是引用的词。您的意思可能是qr//。在这种情况下,它仍然可以工作,因为列表中只有一个单词,因此它将 word 分配给$CurBrLoopMany,而这又可以作为包含未转义元字符的字符串进入s///。所以你没事。但是,还是错了。你想要qr//。 :)
标签: perl