【问题标题】:Perl ignore whitespace on replacement side of regular expression substitutionPerl 忽略正则表达式替换的替换端的空格
【发布时间】:2011-09-03 00:49:17
【问题描述】:

假设我有$str = "onetwo"

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

$str =~ s/
          one
          two
         /
          three
          four
         /x

这会产生"\nthree\nfour\n"(其中\n 是换行符),而不是"threefour"。基本上,/x 选项忽略替换匹配端的空格,但不忽略替换端。我怎样才能忽略替换端的空格?

【问题讨论】:

  • 如果您正在寻找“可读”,请远离正则表达式
  • @Ken,你可能是在半开玩笑,但我正在使用一个非常复杂的 reg ex,需要随着时间的推移进行管理,例如描述 here
  • @Ken Browning,简单的正则表达式模式可以写得很清晰,而更复杂的正则表达式模式需要几页非正则表达式代码才能实现,因此避免正则表达式匹配不会使事情更具可读性。一个常见的错误是人们忘记了它不再可读的替代方案。像其他一切一样,记录正则表达式模式的复杂部分,你就很好了。

标签: regex perl whitespace matching substitution


【解决方案1】:

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;
}

【讨论】:

  • @DVK,什么性能损失。你也许认为 /e 是eval EXPR?不,in 不涉及运行时解析和编译。这样就剩下'threefour''three' . 'four'。后者是对前者的常数折叠,所以我不知道你为什么认为会有性能损失。
  • @ikegami,您能否简要记录一下clean 的可能实现方式?顺便说一句,好主意。
  • @DVK,/e 版本需要 0.000,000,6 秒的时间。这甚至不到一秒。
  • @Lex Fridman,实际上,它有很多问题,所以我更换了它。发布的版本应该有用。 1) 删除每一行的前导空格。 2) 删除前导空行。 3) 删除尾随空行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多