鉴于perl中的正则表达式,如何在该正则表达式中找到捕获的组的最大数量?我知道我可以使用$ 1,$ 2等来引用第一个,第二个等捕获的组。但是如何找到这些组的最大数量?通过捕获的组,我的意思是在paranthesis中由正则表达式匹配的字符串。例如:如果正则表达式是(a +)(b +)c +那么字符串“abc”匹配该正则表达式。第一个被捕获的组将是1美元,第二个将是2美元。
答案 0 :(得分:4)
amon
哈希时, %+
暗示了这个问题的答案。但你需要的是@+
数组:
@+
此数组保存当前活动动态范围中最后成功子匹配的末尾的偏移量。 $ + [0]是整个匹配结束字符串的偏移量。这与在匹配的变量上调用时pos函数返回的值相同。该数组的第n个元素保存第n个子匹配的偏移量,因此$ + 1是$ 1结束的偏移量,$ + [2]是$ 2结束的偏移量,依此类推。 您可以使用$#+来确定上次成功匹配中有多少个子组。请参阅@变量的示例。 [ enphasis添加]
$re = "(.)" x 500;
$str = "a" x 500;
$str =~ /$re/;
print "Num captures is $#+"; # outputs "Num captures is 500"
答案 1 :(得分:0)
捕获次数有效无限。虽然您只能使用$1
- $9
变量访问九个捕获,但您可以使用更多捕获组。
如果您有多个捕获组,则可能需要使用命名捕获,例如
my $str = "foobar";
if ($str =~ /(?<name>fo+)/) {
say $+{name};
}
输出:foo
。您可以通过%+
哈希访问命名捕获的值。
答案 2 :(得分:0)
您可以使用以下代码来计算捕获组:
$regex = qr/..../; # Some arbitrary regex with capture groups
my @capture = '' =~ /$regex|()/; # A successful match incorporating the regex
my $groups_in_my_regex = scalar(@capture) - 1;
它的工作方式是执行必须成功的匹配,然后检查创建了多少个捕获组。 (由于尾随|()
编辑:实际上,似乎没有必要追加额外的捕获组。只要匹配保证成功,那么数组将包含每个捕获组的条目。
因此我们可以将第2行和第3行更改为:
my @capture = '' =~ /$regex|/; # A successful match incorporating the regex
my $groups_in_my_regex = scalar(@capture);