-3

我知道=~ s/(.)\s/$1/seg用空白替换额外的分隔空间,但它是什么$1意思seg

4

2 回答 2

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 代码。在这种情况下,它没有任何效果,因为它只是将一个字符串评估为一个字符串。
  • g对于全局,意味着匹配被尽可能多地执行,而不是只执行一次,这是默认的。

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

但是话又说回来,如果我们这样做,我们还不如跳过检查.和做s/\s+//g。如果意图仅删除非空白之后的空白,则使用\S(non-whitespace) 代替会更谨慎,如下所示.s/(\S)\s/$1/sg

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

于 2013-09-15T11:14:29.630 回答
3

$1指第一个捕获组。这将是任何(.)匹配。

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

  • s将输入视为s单行。它告诉.也匹配\n(通常不匹配)。
  • e将替换模式视为 Perle表达式。不确定它在这里有什么好处,因为s//已经了解$1.
  • g意味着在局部进行这种替换g(即:它出现在字符串中的任何地方,而不仅仅是第一次出现)。
于 2013-09-15T11:14:21.493 回答