Perl正则表达式和捕获组

sno*_*kin 11 regex perl

以下打印 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.