s / \ G / 0 / g是什么意思?

时间:2015-06-05 16:28:44

标签: regex perl

我在Perl中使用正则表达式。我遇到过的一件事:

my $n = "   49 here";
$n =~ s/\G /0/g;
print $n;

这给出了:

00049 here

我知道s修饰符(单行)。我也理解g修饰符(全局,跟踪最后一个匹配位置)。我知道正则表达式用零替换了一些东西,但我不明白\G及其后面的空格是什么(\G后面没有空格,结果是:0 49 here)。

2 个答案:

答案 0 :(得分:4)

\G被称为G-Anchor构造。这意味着它必须匹配上次成功比赛结束的位置。在任何正则表达式开始之前,\G(实际上是一个标志)是true,所以它将以true开始,然后查找空格,找到它,仍然是真的,找到下一个等等。当它找不到空格,\G标志变为false并保持不变(在本例中)。

没有它,它将在字符串中的任何地方寻找空间而不是在开头。

$ perl -E'my $n = "   49 here"; $n =~ s/\G /0/g; say $n'
00049 here

$ perl -E'my $n = "   49 here"; $n =~ s/ /0/g; say $n'
000490here

/\G/g仅在字符串的开头只匹配(无)匹配,因为Perl不会返回完全相同的匹配(定义为具有相同的起始位置和相同的长度)两次。这就是为什么它在那里添加0并在下面停止:

$ perl -E'my $n = "   49 here"; $n =~ s/\G/0/g; say $n'
0   49 here

在Perl中,最后一个匹配结束的位置与匹配的变量(不是运算符)相关联。可以使用pos函数观察和更改它。 \G标志保留变量,而不是正则表达式。由于它与匹配的变量相关联,因此在后续应用另一个正则表达式时,\G将从最后一个匹配开始。

$ perl -E'my $n = "abcdefabc"; $n =~ /def/g; $n =~ s/\Gabc/ABC/; say $n'
abcdefABC

答案 1 :(得分:2)

在Perl中,\G断言上一场比赛结束时的位置或第一场比赛的字符串开头。

这就是为什么开始时的空间和之后的所有后续空格被0替换,但49之后的空格不变。

RegEx Demo(使用PCRE而不是Perl,但\G在该引擎中的含义相同)