Как найти все совпадения с регулярным выражением в Perl? - PullRequest
20 голосов
/ 12 ноября 2009

У меня есть текст в виде:

Name=Value1
Name=Value2
Name=Value3

Используя Perl, я хотел бы сопоставлять /Name=(.+?)/ каждый раз, когда он появляется, и извлекать (. +?) И помещать его в массив. Я знаю, что могу использовать $1, чтобы получить нужный мне текст, и я могу использовать =~, чтобы выполнить сопоставление регулярному выражению, но я не знаю, как получить все совпадения.

Ответы [ 5 ]

46 голосов
/ 12 ноября 2009

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 .

6 голосов
/ 12 ноября 2009
my @values;
while(<DATA>){
  chomp;
  push @values, /Name=(.+?)$/;
}   
print join " " => @values,"\n";

__DATA__
Name=Value1
Name=Value2
Name=Value3
3 голосов
/ 21 сентября 2011

Следующее даст все совпадения регулярному выражению в массиве.

push (@matches,$&) while($string =~ /=(.+)$/g );
1 голос
/ 12 ноября 2009

Используйте модуль Config:: для чтения данных конфигурации. Для чего-то простого, подобного этому, я мог бы получить ConfigReader :: Simple Приятно держаться подальше от сорняков, когда есть возможность.

0 голосов
/ 12 ноября 2009

Вместо использования регулярного выражения вы можете попробовать использовать грамматический движок, например:

Я уже дал фрагмент ответа Parse :: ResDescent ранее на SO. Однако Regexp :: Grammars выглядит очень интересно и под влиянием правил и грамматик Perl6 .

Так что я думал, что у меня будет трещина в Regexp :: Грамматика; -)

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 /

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