我的表格中有文字:
Name=Value1
Name=Value2
Name=Value3
使用Perl,我希望每次出现时匹配/Name=(.+?)/
并提取(。+?)并将其推送到数组上。我知道我可以使用$1
来获取我需要的文本,我可以使用=~
来执行正则表达式匹配,但我不知道如何获得所有匹配。
答案 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 /