正则表达式在乳胶环境中找到并替换

Sam*_*mer 4 regex perl latex

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

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 
Run Code Online (Sandbox Code Playgroud)

然后我想找到所有的"("内\begin{align}\end{align}和不是文本的主体内我到目前为止有正则表达式:

(?<=\{align\})\s(.*)\s(.*)\s(?=\\end\{align\})
Run Code Online (Sandbox Code Playgroud)

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

(这背后的原因是因为我要通过我的整个文件和更改所有的"("里面的方程" \left(",我不想改变,可以使用文本中出现的任何括号内.)

Ste*_*ker 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;
Run Code Online (Sandbox Code Playgroud)

使用给定文本测试运行:

$ 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
Run Code Online (Sandbox Code Playgroud)

或者作为单行:

$ 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}
...
Run Code Online (Sandbox Code Playgroud)

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

 if (/\\begin\{align\}/../\\end\{align\}/) {
Run Code Online (Sandbox Code Playgroud)


rev*_*evo 5

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

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

(?:\\begin{align}|\G(?!\A))(?:(?!\\end{align})[^(])*\K\(
Run Code Online (Sandbox Code Playgroud)

在这里查看现场演示

Perl代码:

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

在这里查看现场演示

正则表达式细分:

  • (?: 开始非捕获组
    • \\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
Run Code Online (Sandbox Code Playgroud)