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

Agn*_*roc 5 regex perl

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

my $n = "   49 here";
$n =~ s/\G /0/g;
print $n;
Run Code Online (Sandbox Code Playgroud)

这给出了:

00049 here
Run Code Online (Sandbox Code Playgroud)

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

小智 5

\G称为 G 锚结构。这意味着它必须匹配上次成功匹配的结束位置。在任何正则表达式开始之前,\G(实际上是一个标志)是true,因此它将以 true 开始,然后查找空格,找到它,仍然为 true,查找下一个,等等。当它找不到空格时,\Gflag 变为 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
Run Code Online (Sandbox Code Playgroud)

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

$ perl -E'my $n = "   49 here"; $n =~ s/\G/0/g; say $n'
0   49 here
Run Code Online (Sandbox Code Playgroud)

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

$ perl -E'my $n = "abcdefabc"; $n =~ /def/g; $n =~ s/\Gabc/ABC/; say $n'
abcdefABC
Run Code Online (Sandbox Code Playgroud)

  • 我不认为它在这里被滥用 - 其意图似乎是将行开头的空格填充数字转换为零填充数字,因此在字符串初始空格之后不匹配是故意的。 (2认同)