以下打印 ac | a | bbb | c
#!/usr/bin/env perl
use strict;
use warnings;
# use re 'debug';
my $str = 'aacbbbcac';
if ($str =~ m/((a+)?(b+)?(c))*/) {
print "$1 | $2 | $3 | $4\n";
}
Run Code Online (Sandbox Code Playgroud)
似乎失败的匹配不会重置捕获的组变量.我错过了什么?
谢谢,
Roh*_*ain 17
似乎失败的匹配不会重置捕获的组变量
那里没有失败的比赛.你的正则表达式匹配字符串罚款.虽然在某些重复中内部组有一些失败的匹配.如果该组在当前重复中不匹配,则每个匹配的组可能会被为该特定组找到的下一个匹配项覆盖,或者保留其与前一个匹配项的值.
让我们看看正则表达式如何进行:
第一(a+)?(b+)?(c)场比赛aac.由于(b+)?是可选的,因此不会匹配.在此阶段,每个捕获组包含以下部分:
$1 包含整场比赛 - aac$2包含(a+)?部分 -aa$3包含(b+)?部分 - null.$4包含(c)部分 -c因为还有一些字符串可以匹配 - bbbcac.进一步 - (a+)?(b+)?(c)匹配 - bbbc.由于(a+)?是可选的,因此不会匹配.
$1包含整场比赛 - bbbc.覆盖之前的值$1$2不匹配.因此,它将包含以前匹配的文本 - aa$3这次匹配.它包含 -bbb$4 火柴 c 再次,(a+)?(b+)?(c)将继续匹配最后一部分 - ac.
$1包含整场比赛 - ac.$2匹配a这个时间.覆盖之前的值$2.它现在包含 - a$3这次没有匹配,因为没有任何(b+)?一部分.它将与之前的比赛相同 - bbb$4比赛c.覆盖上一场比赛的值.它现在包含 - c.现在,字符串中没有任何内容可供匹配.所有捕获组的最终值为:
$1 - ac$2 - a$3 - bbb$4- c.