【发布时间】:2019-05-14 17:09:25
【问题描述】:
我的意见:
$brackets = '\left \right \center \right \left \middle';
在上面的字符串中,我需要将每个\left 字符串替换为( 左大括号,并将每个\right 字符串替换为) 右大括号。
我可以用几种方法替换来获得输出。但是我想知道我们如何在r 修饰符中做到这一点。这是我目前所拥有的
$brackets=~s{\\(left|right)}{$&=~s/\\left/\(/r && $&=~s/\\right/\)/gr; }ge;
我不知道我在哪里可以找到我的错误。
【问题讨论】:
-
Perl 大师在这里相信你不应该“把所有东西都塞进一个正则表达式”。不过,总而言之,你的问题很好。
-
在另一个
s///的替换部分中再放两个s///简直令人作呕。 -
“魔术正则表达式”是我们经常看到的东西——有人试图“编写”一个正则表达式来做所有事情。并且正则表达式很强大,所以你通常可以。它只是......也非常难以理解,并且难以阅读和维护,所以通常你应该做的是分解问题并围绕它编写“真正的”程序代码。
-
如果你只需要处理
(和)替换,你可以使用s/\\((left)|right)/$2 ? '(' : ')'/eg -
让您了解为什么您的正则表达式不起作用:
/r修饰符返回新修改(或未更改)的字符串(此值在此处始终为 true),因此您的&&返回其右侧:s/\\right/\(/,表示左侧绝对没有效果。你可以做($&=~s/\\right/)/r)=~s/\\left/(/r。但请看答案:用一个复杂的正则表达式做所有事情是个坏主意。