Как найти все соответствия регулярному выражению в Perl?
У меня есть текст в форме:
Name=Value1
Name=Value2
Name=Value3
Используя Perl, я хотел бы соответствовать /Name=(.+?)/
каждый раз, когда он появляется, и извлекать (. +?) и нажимать его на массив. Я знаю, что могу использовать $1
для получения текста, который мне нужен, и я могу использовать =~
для выполнения сопоставления регулярных выражений, но я не знаю, как получить все соответствия.
Ответы
Ответ 1
A m//g
в контексте списка возвращает все зафиксированные совпадения.
#!/usr/bin/perl
use strict; use warnings;
my $str = <<EO_STR;
Name=Value1
Name=Value2
Name=Value3
EO_STR
my @matches = $str =~ /=(\w+)/g;
# or my @matches = $str =~ /=([^\n]+)/g;
# or my @matches = $str =~ /=(.+)$/mg;
# depending on what you want to capture
print "@matches\n";
Однако, похоже, что вы разбираете файл конфигурации стиля INI. В этом случае я рекомендую Config::Std.
Ответ 2
my @values;
while(<DATA>){
chomp;
push @values, /Name=(.+?)$/;
}
print join " " => @values,"\n";
__DATA__
Name=Value1
Name=Value2
Name=Value3
Ответ 3
Ниже перечислены все соответствия регулярному выражению в массиве.
push (@matches,$&) while($string =~ /=(.+)$/g );
Ответ 4
Используйте модуль Config::
для чтения данных конфигурации. Для чего-то простого, я мог бы обратиться за ConfigReader::Simple. Приятно держаться подальше от сорняков, когда можете.
Ответ 5
Вместо того, чтобы использовать регулярное выражение, вам может потребоваться использовать механизм грамматики, например:
Я дал фрагмент ответа Parse:: ResDescent до SO. Однако Regexp:: Grammars выглядит очень интересно и под влиянием правил и грамматик Perl6.
Итак, я думал, что у меня будет трещина в Regexp:: Grammars; -)
use strict;
use warnings;
use 5.010;
my $text = q{
Name=Value1
Name = Value2
Name=Value3
};
my $grammar = do {
use Regexp::Grammars;
qr{
<[VariableDeclare]>*
<rule: VariableDeclare>
<Var> \= <Value>
<token: Var> Name
<rule: Value> <MATCH= ([\w]+) >
}xms;
};
if ( $text =~ $grammar ) {
my @Name_values = map { $_->{Value} } @{ $/{VariableDeclare} };
say "@Name_values";
}
Вышеприведенный код выводит Value1 Value2 Value3
.
Очень приятно! Единственное предостережение в том, что для этого требуется Perl 5.10 и что он может быть излишним для приведенного вами примера; -)
/I3az/