gpt4 book ai didi

regex - Perl 正则表达式和捕获组

转载 作者:行者123 更新时间:2023-12-04 01:51:39 37 4
gpt4 key购买 nike

以下打印 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";
}
似乎失败的匹配不会重置捕获的组变量。
我错过了什么?

最佳答案

it seems like failed matches dont reset the captured group variables



那里没有失败的比赛。您的正则表达式与字符串匹配。尽管在某些重复中,内部组的匹配失败了。每个匹配的组可能会被为该特定组找到的下一个匹配项覆盖,或者如果该组在当前重复中不匹配,则保留前一个匹配项的值。

让我们看看正则表达式匹配是如何进行的:
  • 第一 (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 .
  • 关于regex - Perl 正则表达式和捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642169/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com