如何在Perl中匹配regex单组合与多组同一模式
我有以下格式的数据:如何在Perl中匹配regex单组合与多组同一模式,regex,perl,Regex,Perl,我有以下格式的数据: n123a456ba789ba101112ba131415b n124a12345ba78910ba101113b n125a1234ba7891ba101114ba131415ba16171819b n跟随一些数据直到a 一个是起始字段 b是结束字段 它有多个字段a…b 我想把n个数据和a…b之间的数据捕获到数组中。 我尝试了以下代码,但没有成功 $var = "n123a456ba789ba101112ba131415b"; ($n, @groups) = $var
n123a456ba789ba101112ba131415b
n124a12345ba78910ba101113b
n125a1234ba7891ba101114ba131415ba16171819b
n跟随一些数据直到a
一个是起始字段
b是结束字段
它有多个字段a…b
我想把n个数据和a…b之间的数据捕获到数组中。
我尝试了以下代码,但没有成功
$var = "n123a456ba789ba101112ba131415b";
($n, @groups) = $var =~ /n(.+?)(?:a(.+?)b)+/;
print join(',', $n, @groups);
您可以使用以下正则表达式: 工作原理:
分支重置-这类组中的任何子模式共享相同的编号(如果存在替换,这将使捕获组共享相同的索引)(?|…)
匹配以下任一选项:n([^a]+)(?=a)| a([^b]+)b
n([^a]+)(?=a)
按字面意思匹配n
n
将([^a]+)
以外的任何字符捕获到捕获组中一次或多次a
确保字符(?=a)
跟随(正向前瞻)而不消耗字符a
a([^b]+)b
按字面意思匹配a
a
将除([^b]+)
之外的任何字符捕获到捕获组中一次或多次b
按字面意思匹配b
b
请验证以下代码是否符合您的要求
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
目标采样线似乎相当一致。
这是一种在单个数组中获取所有数据的快速方法,如果需要,也可以通过
my($n,@vals)
对捕获进行分配
$_ = "n123a456ba789ba101112ba131415b";
my @vals = /[na]([^ab]*)/g;
print join(',', @vals)
输出
123,456,789,101112,131415
另一种方法是使用:
将正则表达式更改为
/a([^b]+)b/g
:请参见代码I need n=123。但这不符合a…b
的规则-该字段的规则是什么?n跟随一些值,直到aDoes/(?| n([^a]+)(?=a)| a([^b]+)b)/g
为您工作为止?好吧,那为什么我的@vals=/(\d+)/g;?你们说的相当一致——对我来说,这意味着a和b之间始终是数字。
$VAR1 = {
'123' => [
'456',
'789',
'101112',
'131415'
],
'125' => [
'1234',
'7891',
'101114',
'131415',
'16171819'
],
'124' => [
'12345',
'78910',
'101113'
]
};
$_ = "n123a456ba789ba101112ba131415b";
my @vals = /[na]([^ab]*)/g;
print join(',', @vals)
123,456,789,101112,131415
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)