如何在Perl中将正则表达式单组合与多组相同模式匹配

时间:2019-12-23 17:37:07

标签: regex perl

我的数据格式如下:

n123a456ba789ba101112ba131415b
n124a12345ba78910ba101113b
n125a1234ba7891ba101114ba131415ba16171819b

n跟着一些数据直到a。

a是开始字段。

b是结束字段。

它具有多个字段a ... b

我想将n个数据和a ... b之间的数据捕获到数组中。 我尝试使用以下代码,但没有用。

$var = "n123a456ba789ba101112ba131415b";

($n, @groups) = $var =~ /n(.+?)(?:a(.+?)b)+/;

print join(',', $n, @groups);

3 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

See regex in use here

/(?|n([^a]+)(?=a)|a([^b]+)b)/g

工作原理:

  • (?|...)分支重置-该组中的任何子模式共享相同的编号(如果存在交替,则捕获组共享相同的索引)
  • n([^a]+)(?=a)|a([^b]+)b匹配以下任一选项:
    • n([^a]+)(?=a)
      • n从字面上匹配n
      • ([^a]+)a以外的任何字符捕获一次或多次到捕获组中
      • (?=a)确保字符a跟随(正向提前)而不消耗字符
    • a([^b]+)b
      • a从字面上匹配a
      • ([^b]+)b以外的任何字符捕获一次或多次到捕获组中
      • b从字面上匹配b

See code in use here

$var = "n123a456ba789ba101112ba131415b";
($n, @groups) = $var =~ /(?|n([^a]+)(?=a)|a([^b]+)b)/g;
print join(',', $n, @groups);

答案 1 :(得分:0)

请验证以下代码是否符合您的要求

use strict;
use warnings;

use feature 'say';

use Data::Dumper;

my %hash;

while( <DATA> ) {
    if( /^n(\d+)/ ) {
        my $n = $1;
        my @data = /a(\d+?)b/g;
        $hash{$n} = \@data;
    } 
}

say Dumper(\%hash);

__DATA__
n123a456ba789ba101112ba131415b
n124a12345ba78910ba101113b
n125a1234ba7891ba101114ba131415ba16171819b

输出

$VAR1 = {
          '123' => [
                     '456',
                     '789',
                     '101112',
                     '131415'
                   ],
          '125' => [
                     '1234',
                     '7891',
                     '101114',
                     '131415',
                     '16171819'
                   ],
          '124' => [
                     '12345',
                     '78910',
                     '101113'
                   ]
        };

答案 2 :(得分:0)

另一种方法是使用split

use strict;
use warnings;
use Data::Dump qw(dump);

while(<DATA>) {
    chomp;
    my @l = split /[nab]+/, $_;
    shift @l;
    dump@l;
}

__DATA__
n123a456ba789ba101112ba131415b
n124a12345ba78910ba101113b
n125a1234ba7891ba101114ba131415ba16171819b

输出:

(123, 456, 789, 101112, 131415)
(124, 12345, 78910, 101113)
(125, 1234, 7891, 101114, 131415, 16171819)