正则表达式在Latex环境之间找到并替换

问题描述 投票:4回答:2

我正在尝试使用正则表达式来查找和替换,以便我可以找到所有'('对齐环境中使用的'字符。示例文本:

Lorem Ipsum Lorem Ipsum Lorem Ipsum 
Lorem Ipsum Lorem Ipsum (Lorem Ipsum Lorem Ipsum )
Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum 
\begin{align}
\frac{d_l}{2}< |\epsilon_H(g(m))| <\frac{d_r}{2} 
\frac{d_l}{2}< |\epsilon_H(g(m))| <\frac{d_r}{2} 
\end{align}
Lorem Ipsum Lorem Ipsum Lorem Ipsum 
Lorem Ipsum Lorem Ipsum Lorem Ipsum 

然后我想找到所有'('\begin{align}\end{align}and内部不在主体内部。我到目前为止有正则表达式:

(?<=\{align\})\s(.*)\s(.*)\s(?=\\end\{align\})

但这只能查找环境中的所有文本,而不是'('。

(这背后的原因是因为我需要浏览整个文档并将所有'('在方程式内部更改为'\left(',我不想更改可能使用的文本中出现的任何括号。)

regex perl latex
2个回答
6
投票

在标量上下文中使用范围运算符(..),即触发器,以隔离要处理的块。

#!/usr/bin/perl
use strict;
use warnings;

while (<STDIN>) {
    if (/^\\begin\{align\}/../^\\end\{align\}/) {
        # replace all occurences of "(" with "\left("
        s/\(/\\left(/g;
    }
    print;
}

exit 0;

使用给定文本测试运行:

$ perl dummy.pl <dummy.txt
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum (Lorem Ipsum Lorem Ipsum )
Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum
\begin{align}
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
\end{align}
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum

或者作为单行:

$ perl <dummy.txt -pe 's/\(/\\left(/g if (/^\\begin\{align\}/../^\\end\{align\}/)'
...
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
...

如果块检测太严格,即在您的真实文档中\begin\end不在行的开头,那么在没有^(插入符号)的情况下尝试以下操作:

 if (/\\begin\{align\}/../\\end\{align\}/) {

5
投票

有两种技术可以完成给定的任务。一个是从\\begin{align}开始比赛,两个是信号引擎,在面对(后立即停止匹配\\end{align}

第一步可以使用\G令牌,第二步是限制性匹配或tempered-[^(]的工作。

(?:\\begin{align}|\G(?!\A))(?:(?!\\end{align})[^(])*\K\(

live demo here

Perl代码:

my $regex = qr/(?:\\begin{align}|\G(?!\A))(?:(?!\\end{align})[^(])*\K\(/p;
my $subst = '\\\\left(';
my $result = $str =~ s/$regex/$subst/rg;

live demo here

正则表达式细分:

  • (?:开始非捕获组 \\begin{align}字面上匹配\begin{align} |\G(?!\A)从上一场比赛结束时开始比赛
  • )非捕获组的结束
  • (?: NCG的开始 (?!\\end{align})直到我们到达\end{align} [^(]尝试匹配非(角色
  • )* NCG结束,尽可能重复
  • \K\(重置匹配的部分并尝试匹配(

一内胆:

perl -0777 -i.bak -pe 's~(?:\\begin\{align}|\G(?!\A))(?:(?!\\end\{align})[^(])*\K\(~\\left(~g;' file
© www.soinside.com 2019 - 2024. All rights reserved.