Perl перебирает количество регулярных выражений - PullRequest
1 голос
/ 26 сентября 2019

У меня есть несколько строк, таких как

int foo[] = { a, b, c, d, e };

Точное количество элементов в массиве неизвестно.Я хочу сопоставить его, используя регулярное выражение perl.Я идентифицирую строки, используя

if ( $line =~ /^\ *int\ *([a-z]+)\ *\[\]\ *=\ *{(\ *([a-z]+)\ *,?)+}\ *;/ )
{
  print $line;
}

Как узнать количество совпадений, поскольку я хочу работать с каждым из элементов в массиве?

В идеалеЯ хотел бы что-то вроде

if ( $line =~ /^\ *int\ *([a-z]+)\ *\[\]\ *=\ *{(\ *([a-z]+)\ *,?)+}\ *;/ )
{
  my $count_of_matches = ??????
  for (my $matches=0 ; $matches<count_of_matches ; $matches++)
  {
    print $matches, "\n";
  }
}

, что должно привести к чему-то вроде

foo
a
b
c
d
e

Я попытался

my $count_of_matches = () = $line =~ /.../ # using the same pattern as above

my @list  = $line =~ /.../
my $other_count_of_matches = scalar @list

Но я получил счет 3, имассив perl содержит только имя массива (foo) и дважды последний элемент (e).

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

Сделайте это в два этапа.Сначала сопоставьте все содержимое {...}, затем используйте split для извлечения отдельных элементов.

Кстати, вам не нужно использовать обратную косую черту (если вы не используете /xмодификатор).

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my $string = 'int foo[] = { a, b, c, d, e };';

my ($array, $elements) = $string =~ /^ *int *([a-z]+) *\[\] *= *\{ *((?:[a-z]+ *,? *)+)\};/;
my @elements = split /[, ]+/, $elements;

say "<$_>" for $array, @elements;
1 голос
/ 26 сентября 2019

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

use MarpaX::Languages::C::Scan qw();
my $ast = MarpaX::Languages::C::Scan->new(
    content => 'int foo[] = { a, b, c, d, e };'
)->ast;
for my $id (
    $ast->findnodes('//declarator//IDENTIFIER'),
    $ast->findnodes('//initializerList//IDENTIFIER')
) {
    say $id->getAttribute('text');
}
__END__
foo
a
b
c
d
e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...