Как я могу узнать, сколько скобок захвата в регулярном выражении Perl? - PullRequest
3 голосов
/ 27 мая 2009

Если мне дано в Perl, могу ли я узнать, сколько есть скобок захвата? Так, например:

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

Ответы [ 4 ]

4 голосов
/ 27 мая 2009

Хотите знать, сколько совпадений или сколько наборов скобок? Если вы хотите иметь возможность подсчитывать скобки, вы можете взглянуть на модуль типа Text :: Balanced , который анализирует текст с разделителями.

С другой стороны, если вы хотите знать, какие совпадения существуют, вам лучше выполнить свое регулярное выражение в контексте списка:

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

Размер списка даст вам количество совпадений:

my $count = @matches;

(поскольку список или массив в скалярном контексте дает размер списка или массива).

2 голосов
/ 27 мая 2009

Важно знать, зачем вам это нужно.

Помогает ли 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
1 голос
/ 27 мая 2009

Это не совсем тривиально, поскольку не все скобки не захватывают - например (?: ...), (? = ...) и т. Д.

Как правило, помните, что вы всегда можете:

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

, а затем просто проверьте @catch_all;

1 голос
/ 27 мая 2009

Есть два специальных массива @ - и @ +, содержащих стартовые позиции и конечные позиции успешных матчей. Используйте длину массива когда сопоставление сделано.

Статический анализ: Чтобы узнать все пары, вам нужно проанализировать строку регулярного выражения. Подсчитайте все открывающиеся скобки без выхода, у которых есть закрывающий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...