我的数据格式如下:
n123a456ba789ba101112ba131415b
n124a12345ba78910ba101113b
n125a1234ba7891ba101114ba131415ba16171819b
n跟着一些数据直到a。
a是开始字段。
b是结束字段。
它具有多个字段a ... b
我想将n个数据和a ... b之间的数据捕获到数组中。 我尝试使用以下代码,但没有用。
$var = "n123a456ba789ba101112ba131415b";
($n, @groups) = $var =~ /n(.+?)(?:a(.+?)b)+/;
print join(',', $n, @groups);
答案 0 :(得分:1)
您可以使用以下正则表达式:
/(?|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
$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)