【问题标题】:Regex need for the nested curly braces - Perl正则表达式需要嵌套花括号 - Perl
【发布时间】: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


【解决方案1】:


搜索大括号{} 的正则表达式需要更深一层
您不需要第一个全局括号()
最后,就像 "simbabque" 在其评论中所说的那样,您必须使用qr// 代码而不是qw// 代码来定义一个正则表达式或一段正则表达式。

所以你必须像这样改变你的变量:

my $CurBrLoopMany = qr/(?:[^{}]*(?:{(?:[^{}]*(?:{(?:[^{}]*(?:{[^{}]*})*[^{}]*)})*[^{}]*)*})*[^{}]*)*/;

我试了成功:

> cat test
#!/usr/bin/perl -w
use strict;
my $inxmlstr = '$$\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)\!.}$$';
print "BEFORE:      $inxmlstr\n";
my $CurBrLoopMany = qr/(?:[^{}]*(?:{(?:[^{}]*(?:{(?:[^{}]*(?:{[^{}]*})*[^{}]*)})*[^{}]*)*})*[^{}]*)*/;
$inxmlstr =~ s/\\eqalign\{($CurBrLoopMany)\}/\\begin{align*}$1\\end\{align*}/gs;
print "AFTER : $inxmlstr\n";

> ./test
BEFORE:      $$\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)\!.}$$
AFTER : $$\begin{align*}&\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)\!.\end{align*}$$

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2020-04-27
    • 2014-10-09
    相关资源
    最近更新 更多