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

标签 regex perl

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

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

这给出:
00049 here

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

最佳答案

\G称为 G-Anchor 结构。这意味着它必须匹配上次成功匹配结束的地方。在任何正则表达式开始之前,\G (真的是一面旗帜)是 true ,所以它将开始为真,然后寻找一个空格,找到它,仍然为真,找到下一个等等。当它没有找到一个空格时,\G flag 变为 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只会在字符串的开头匹配(无)1 次,因为 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

关于regex - s/\G/0/g 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30671435/

相关文章:

python - 匹配大写/特殊/unicode/越南字符的正则表达式

java 正则表达式用空格分割字符串(除非左边和右边都是数字或 - )

linux - 在 Perl 中使用 expect 和 system()

apache - 如何在apache服务器上运行cgi脚本

Perl:如何让 Emacs 将引号添加到 Perl 脚本的完整路径?

python - 正则表达式查找单词中的连续字符并删除该单词

html - kate - 正则表达式 - 查找并将 URL 部分从 href 替换为 ">

java - 用于从字符串中查找 http 和 https url 的正则表达式

python - 用正则表达式置换矩阵的参数

php - 需要 "pack"的帮助,用于 perl 和 php