正则表达式中捕获组的数量有限制吗?我曾经认为是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";
请注意,此问题:How many captured groups are supported by pcre2 substitute function只引用PCRE2 C库,我问的是Perl。
3条答案
按热度按时间wgmfuz8q1#
https://perldoc.perl.org/perlre表示:
您可以使用的捕获子字符串的数量没有限制。
yhived7q2#
为什么不测试一下呢?Regexp有2000万次捕获,这对任何人来说都足够了。这让我觉得内存是这里的极限。这在我的旧笔记本电脑上用了25秒的时间,使用perl v5.30:
vhmi4jdf3#
你可以试试看!即使没有内在的限制,也可能有一个实际的限制。
让我们在我的M1 Mac Mini上试用Perl v5.36。
下面是一个小程序,它可以捕获我想要的一些捕获,然后构建一个足够长的字符串来匹配这些捕获,并构建一个包含这些捕获的模式(请查看v5.36
builtin::ceil
的用法):当我运行不同的长度时,我最终让shell给予:
我的机器放弃了1,234,567,890个分组,这可能与分组的数量无关;也许perl中的其他东西决定它不满意,或者也许程序超出了一些进程资源的限制。你自己的机器可能在不同的点给予(或者根本不放弃)。我不知道是什么杀死了它,我真的不在乎,因为即使我知道,我也不会做任何事情来修复它。
但是,我能找到最大的数字吗?它大约是389,000,000次捕获。这不是一个固定的数字,我可以一致地预测,可能取决于其他不相关的事情在同一时间发生。