获取匹配模式perl的所有匹配项

时间:2019-02-12 10:06:03

标签: regex perl

如果我们处于以下情况:

var_TargetLine = var_MyString

我在数据库中有一个表 my $str = <<EO_STR; Name=Value1 Adress=Value4 Name=Value2 Adress=Value5 Name=Value3 Adress=Value6 EO_STR ,其中包含列:"T1",并且我想将列("Name", "Address")的值"Name"放在列{{1} }值"value1,Value2,Value3" 在这种情况下,我们有:

"Adress"

我们如何将"Value4,Value5,Value6"my @matches = $str =~ /Name=(.*?)\nAdress=(.*?)\n/g; $1一起使用,以便分别获得Name和Adresse的所有出现,以便将它们插入表$2中? / p>

3 个答案:

答案 0 :(得分:4)

所有匹配项的所有捕获都将返回,因此您必须将它们分组。

use List::Util 1.29 qw( pairs );

for ( pairs( $str =~ /Name=(.*) Address=(.*)/g ) ) {
   my @matches = @$_;
    ...
}

也就是说,以迭代方式获取比赛更为普遍。

while ($str =~ /Name=(.*) Address=(.*)/g) {
   my @matches = ( $1, $2 );
   ...
}

答案 1 :(得分:3)

Regex并非总是适合该工作的工具。您的数据看起来很像键/值对。使用split进行分解。这里不需要模式匹配。

您的代码和数据不匹配,因此我不再使用代码中的内容。

use strict;
use warnings;

my $str = <<EO_STR;
   Name=Value1
   Adress=Value4
   Name=Value2
   Adress=Value5
   Name=Value3
   Adress=Value6
EO_STR

my $fields;
foreach my $pair (split /\n/, $str) {
    my ($key, $value) = split /=/, $pair;
    $key =~ s/^\s+//;
    push @{ $fields->{$key} }, $value;
}

use Data::Dumper;
print Dumper $fields;

代码将创建以下数据结构:

$VAR1 = {
          'Name' => [
                      'Value1',
                      'Value2',
                      'Value3'
                    ],
          'Adress' => [
                        'Value4',
                        'Value5',
                        'Value6'
                      ]
        };

您现在可以访问这两个数组引用,并使用它们将数据插入表中。

答案 2 :(得分:2)

我已经执行以下操作:

#!/usr/bin/env perl
use v5.28;
my $str = <<EO_STR;
    Name=Value1 Adress=Value4
    Name=Value2 Adress=Value5
    Name=Value3 Adress=Value6
EO_STR
my @array;
for my $a (split(/\n/, $str)) {
    my %res = $a =~ m/(\w+)=(\w+)/g;
    push @array, \%res;
}
for my $a (@array) {
    for my $b (sort keys %{$a}) {
      "\n", <INPUT_FILE> );   say $b.'->'.$a->{$b};
    }
}

它将创建以下结构:

@array = [
    {
        Name->Value1,
        Adress->Value4
    },
    ...
];