Regex Perl忽略正则表达式替换端的空白

Regex Perl忽略正则表达式替换端的空白,regex,perl,whitespace,matching,substitution,Regex,Perl,Whitespace,Matching,Substitution,假设我有$str=“onetwo” 我想编写一个忽略空白的reg ex替换命令(这使它更可读): 而不是“three-four”,这将生成“\n三个\n”(其中\n是一个换行符)。基本上,/x选项忽略替换的匹配端的空白,但不忽略替换端的空白。我怎么能忽略替换端的空白呢?s{…}{…}基本上是s{…}{qq{…}}e。如果你不想要qq{…},你需要用其他东西来替换它 s/ one two / 'three' . 'four' /ex 甚至: s/ one tw

假设我有
$str=“onetwo”

我想编写一个忽略空白的reg ex替换命令(这使它更可读):


而不是
“three-four”
,这将生成
“\n三个\n”
(其中
\n
是一个换行符)。基本上,
/x
选项忽略替换的匹配端的空白,但不忽略替换端的空白。我怎么能忽略替换端的空白呢?

s{…}{…}
基本上是
s{…}{qq{…}}e
。如果你不想要
qq{…}
,你需要用其他东西来替换它

s/
   one
   two
/
   'three' .
   'four'
/ex
甚至:

s/
   one
   two
/
   clean('
      three
      four
   ')
/ex
clean
的可能实现:

sub clean {
    my ($s) = @_;
    $s =~ s/^[ \t]+//mg;
    $s =~ s/^\s+//;
    $s =~ s/\s+\z//;
    return $s;
}

如果你在寻找“可读性”,请远离regex@Ken,你们可能半开玩笑,但我使用的是一个非常复杂的regex,需要随着时间的推移进行管理,例如@Ken Browning所描述的,简单的regex模式可以写得非常清晰,而更复杂的regex模式需要几页非regex代码才能实现,因此,避免正则表达式匹配不会使事情更具可读性。一个常见的错误是人们忘记了另一种选择,因为它不再具有可读性。像其他事情一样,记录正则表达式模式的复杂部分,你就很好了。@DVK,性能损失是多少。您是否认为/e是
eval EXPR
?不,in不涉及运行时解析和编译。所以剩下的是
'three-four'
vs
'three'四个“
。后者总是与前者重叠,所以我不知道你为什么认为会有性能损失。@ikegami,你能简要说明一下
clean
的可能实现吗?好主意,顺便说一句。@DVK,/e版本需要多花0.000000,6秒。“这甚至不到一纳秒。”莱克斯·弗里德曼,事实上,这辆车相当多,所以我把它换了。发布的版本应该是有用的。1) 删除每行的前导空格。2) 删除前导空白行。3) 删除尾随的空行。
sub clean {
    my ($s) = @_;
    $s =~ s/^[ \t]+//mg;
    $s =~ s/^\s+//;
    $s =~ s/\s+\z//;
    return $s;
}