perl中的替换语句是什么意思= ~s /(。)\ s / $ 1 / seg?

时间:2013-09-15 11:04:24

标签: perl

我知道=~ s/(.)\s/$1/seg用空格替换额外的分隔空格但$1seg的含义是什么?

2 个答案:

答案 0 :(得分:5)

这是一些删除空格的尝试,虽然它有点不规则,我不确定这是否是故意的。

s/(.)      # match a single character, capture string into $1
  \s       # match a single whitespace
 /         # replace with
 $1        # the captured string from above
 /seg      # use these modifiers on the substitution
  • s更改通配符.的行为以匹配换行符
  • e导致替换被评估为Perl代码。在这种情况下,它没有任何效果,因为它只是将字符串eval为字符串。
  • g表示全局,表示匹配执行次数最多,而不是一次,这是默认值。

此替换的行为是删除单个空格,这可能是尝试将字符串a foo bar转换为afoobar。但是,在多个连续空格的情况下,它将只删除所有其他空格,因为.将匹配空格。因此a foo bar将成为afoo bar。为了解决这个问题,可以在\s字符类中添加一个量词,并允许它多次匹配:\s+

但是,如果我们这样做,我们不妨跳过检查.并执行s/\s+//g。如果目的是仅删除非空格后面的空格,则使用\S(非空格)而非.更为谨慎,如下所示:s/(\S)\s/$1/sg

正如我所说,这是一个有点奇怪的替代。

答案 1 :(得分:3)

$1指的是第一个捕获组。它将是(.)匹配的任何内容。

seg是一堆正则表达式标志:

  • s将输入视为s ingle行。它告诉.也匹配\n(它通常不会)。
  • e将替换模式视为Perl e xpression。由于s//已经了解$1
  • ,因此不确定它在这方面有多好处
  • g意味着以g形式替换它(即:它出现在字符串中的任何地方,而不是第一次出现)。