我知道=~ s/(.)\s/$1/seg
用空白替换额外的分隔空间,但它是什么$1
意思seg
?
问问题
2181 次
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 回答