如何找出Perl regexp中有多少个捕获括号?

时间:2009-05-27 09:11:18

标签: regex perl

如果我在Perl中获得,我可以找出有多少个捕获括号吗? 所以,例如:

\w       -> 0
(\w)     -> 1
(\w(\w)) -> 2

4 个答案:

答案 0 :(得分:4)

你想知道有多少匹配或多少套括号?如果您希望能够计算括号,那么您可能需要查看一个解析分隔文本的Text::Balanced模块。

另一方面,如果你想知道匹配的情况,最好在列表上下文中执行正则表达式:

my @matches = $string_to_match_on =~ /(\w(\w))/;

列表的大小将为您提供匹配数量:

my $count = @matches;

(作为标量上下文中的列表或数组给出列表或数组的大小)。

答案 1 :(得分:2)

重要的是要知道为什么需要这个。

YAPE::Regex有帮助吗?

编辑:以下是演示:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use YAPE::Regex;

my $regex = qr/^(A)(B)(C)[0-9]+(\w+)$/;

my $parser = YAPE::Regex->new($regex);

my $n_captures;

while (my $node = $parser->next) {
    if ( $parser->state =~ /^capture\(([0-9]+)\)$/ ) {
        $n_captures = $1;
    }
}

print "$n_captures\n";


C:\Temp> t
4

答案 2 :(得分:1)

有两个特殊的数组@ - 和@ +包含起始位置 和成功比赛的结束位置。使用数组长度 匹配完成后。

静态分析:要知道解析正则表达式字符串所需的所有对。 计算所有未关闭的未开启的开口括号。

答案 3 :(得分:1)

并非所有括号都没有捕获 - 例如(?:...),(?= ...)等等,这并不是一件轻而易举的事。

一般来说,记住你总是可以:

my @catch_all = $string =~ m/......................./;

然后只需检查@catch_all;