perl正则表达式中捕获的组的最大数量

时间:2013-07-10 22:43:57

标签: perl grouping regex

鉴于perl中的正则表达式,如何在该正则表达式中找到捕获的组的最大数量?我知道我可以使用$ 1,$ 2等来引用第一个,第二个等捕获的组。但是如何找到这些组的最大数量?通过捕获的组,我的意思是在paranthesis中由正则表达式匹配的字符串。例如:如果正则表达式是(a +)(b +)c +那么字符串“abc”匹配该正则表达式。第一个被捕获的组将是1美元,第二个将是2美元。

3 个答案:

答案 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);

另见:
 Count the capture groups in a qr regex?