Я хочу, чтобы заменить \ EQAlign {...} в \ {начать выравнивать *} ... \ endalign *} для текста ниже:Regex необходимость вложенных фигурных скобок - Perl
$$\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;
Однако я не мог в состоянии заменить вложенный список скобки (квадратные, фигурные, скобки).
Кому понравилось?
В данном случае, вы можете легко сопрягать с начала строки/конца '$$ 'и решение тривиально. В свою очередь, в общем случае вы сталкиваетесь с * нерегулярным языком, который не может быть проанализирован с помощью регулярного выражения. Но регулярное выражение Perl позволяет вам делать такие вещи своими расширениями *. Посмотрите [здесь] (http://stackoverflow.com/a/2595382/1529709) на пример, как вы могли **, но, вероятно, не должны **, сделайте это. – zb226
Вы говорите 'qw //', который является _quoted words_. Вероятно, вы имели в виду 'qr //'. В этом случае он будет работать в любом случае, потому что в списке есть только одно слово, и по этой причине он присваивает этому _word_ '$ CurBrLoopMany', который, в свою очередь, может быть помещен как строка, содержащая неэкранированные метасимволы в' s ///'. Так что ты в порядке. Но все-таки это неправильно. Вы хотите 'qr //'. :) – simbabque