Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中匹配regex单组合与多组同一模式_Regex_Perl - Fatal编程技术网

如何在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)