我正在尝试使用正则表达式来查找和替换,以便我可以找到所有'('对齐环境中使用的'字符。示例文本:
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(
',我不想更改可能使用的文本中出现的任何括号。)
在标量上下文中使用范围运算符(..
),即触发器,以隔离要处理的块。
#!/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\}/) {
有两种技术可以完成给定的任务。一个是从\\begin{align}
开始比赛,两个是信号引擎,在面对(
后立即停止匹配\\end{align}
。
第一步可以使用\G
令牌,第二步是限制性匹配或tempered-[^(]
的工作。
(?:\\begin{align}|\G(?!\A))(?:(?!\\end{align})[^(])*\K\(
Perl代码:
my $regex = qr/(?:\\begin{align}|\G(?!\A))(?:(?!\\end{align})[^(])*\K\(/p;
my $subst = '\\\\left(';
my $result = $str =~ s/$regex/$subst/rg;
正则表达式细分:
(?:
开始非捕获组
\\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