在 Perl 中,正则表达式中的捕获组数量是否有限制?

liv*_*e75 5 regex perl capturing-group

正则表达式中的捕获组数量是否有限制?我曾经认为它是 9 ($1 ... $9),但在 perlre 文档中没有找到任何内容来证实这一点。事实上,下面的代码显示至少有 26 个。

#!/usr/local/bin/perl

use strict;
use warnings;

my $line = " a b c d e f g h i j k l m n o p q r s t u v w x y z ";

my $lp = "(\\w) ";
my $pat = "";
for (my $i=0; $i<26; $i++)
{
   $pat = $pat . $lp;
}

$line =~ /$pat/;
print "$1 $2 $3 $24 $25 $26\n";
Run Code Online (Sandbox Code Playgroud)

请注意,这个问题: How much capture groups aresupported by PCRE2 replacement function仅指PCRE2 C库。我问的是 Perl。

yst*_*sth 7

https://perldoc.perl.org/perlre说:

您可以使用的捕获子字符串的数量没有限制。


Kje*_* S. 5

为什么不直接测试一下呢。具有 2000 万次捕获的正则表达式对于任何人来说都应该足够了。让我觉得记忆力是这里的极限。在我装有 Perl v5.30 的旧笔记本电脑上,这花了 25 秒:

my $n = 20_000_000;                 # 20 million
my $re = join"", map "(.)", 1..$n;  # create regexp with 20 million captures
my $str = "ABC" x $n;               # create a more than long enough string
$str =~ /$re/;                      # match & capture
print $19999987, "\n";              # print the "A" in capture var number 19999987
print ${^CAPTURE}[19999987-1],"\n"; # same
print "Length: ".@{^CAPTURE}."\n";  # prints 20000000, length of array
Run Code Online (Sandbox Code Playgroud)