如何在Perl中找到正则表达式的所有匹配项?

时间:2009-11-12 16:18:47

标签: regex perl

我的表格中有文字:

Name=Value1
Name=Value2
Name=Value3

使用Perl,我希望每次出现时匹配/Name=(.+?)/并提取(。+?)并将其推送到数组上。我知道我可以使用$1来获取我需要的文本,我可以使用=~来执行正则表达式匹配,但我不知道如何获得所有匹配。

5 个答案:

答案 0 :(得分:46)

列表上下文中的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

答案 1 :(得分:6)

my @values;
while(<DATA>){
  chomp;
  push @values, /Name=(.+?)$/;
}   
print join " " => @values,"\n";

__DATA__
Name=Value1
Name=Value2
Name=Value3

答案 2 :(得分:3)

以下将给出数组中正则表达式的所有匹配。

push (@matches,$&) while($string =~ /=(.+)$/g );

答案 3 :(得分:1)

使用Config::模块读取配置数据。对于像这样简单的事情,我可能会找到ConfigReader::Simple。无论何时你都可以远离杂草。

答案 4 :(得分:0)

您可能更喜欢尝试使用语法引擎,而不是使用正则表达式:

我之前已经给出了Parse::ResDescent答案的片段。然而Regexp :: Grammars看起来非常有趣,受Perl6 rules & grammars的影响。

所以我认为我对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 /