代码之家  ›  专栏  ›  技术社区  ›  Thomas Owens

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

  •  19
  • Thomas Owens  · 技术社区  · 15 年前

    我在表格中有文本:

    Name=Value1
    Name=Value2
    Name=Value3
    

    使用Perl,我想匹配 /Name=(.+?)/ 每次出现并提取(.+?)把它推到一个阵列上。我知道我可以用 $1 要获取我需要的文本,我可以使用 =~ 执行regex匹配,但我不知道如何获取所有匹配。

    5 回复  |  直到 15 年前
        1
  •  45
  •   Sinan Ünür    15 年前

    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
  •  6
  •   Sinan Ünür    15 年前
    my @values;
    while(<DATA>){
      chomp;
      push @values, /Name=(.+?)$/;
    }   
    print join " " => @values,"\n";
    
    __DATA__
    Name=Value1
    Name=Value2
    Name=Value3
    
        3
  •  3
  •   Jason Plank Maksim Kondratyuk    13 年前

    下面将为数组中的regex提供所有匹配项。

    push (@matches,$&) while($string =~ /=(.+)$/g );
    
        4
  •  1
  •   brian d foy    15 年前

    使用A Config:: 读取配置数据的模块。对于这样简单的事情,我可能会 ConfigReader::Simple . 无论何时只要你能远离杂草,那就太好了。

        5
  •  0
  •   Community CDub    7 年前

    与使用正则表达式不同,您可能更喜欢尝试语法引擎,例如:

    我给了一个 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 .

    很不错的!唯一需要注意的是,它需要Perl5.10,并且对于您提供的示例来说,它可能是杀伤力过大的;-)

    /I3AZ/