代码之家  ›  专栏  ›  技术社区  ›  justintime

我如何知道Perl正则表达式中有多少个捕获括号?

  •  3
  • justintime  · 技术社区  · 17 年前

    如果给我一个 在Perl中,我可以找出有多少个捕获括号吗?

    \w       -> 0
    (\w)     -> 1
    (\w(\w)) -> 2
    
    4 回复  |  直到 9 年前
        1
  •  4
  •   Nic Gibson    17 年前

    你想知道有多少个匹配项或有多少组括号吗?如果你想能够计算括号,那么你可能想看看这样的模块 Text::Balanced 其解析分隔文本。

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

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

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

    my $count = @matches;
    

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

        2
  •  2
  •   Sinan Ünür    17 年前

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

    是否 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
    
        3
  •  1
  •   Fritz G. Mehner    17 年前

    有两个特殊的数组@-和@+包含起始位置 当匹配完成时。

    静态分析:要了解所有对,您需要解析正则表达式字符串。 计算所有有闭合支撑的无盖开启支撑。

        4
  •  1
  •   user80168 user80168    17 年前

    这并不简单,因为并非所有括号都能捕捉到——例如(?:…)、(?=…)等等。

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

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

    然后只需勾选@catch_all;