Perl重用正则表达式的一部分

时间:2017-05-04 15:09:40

标签: regex perl

我正在尝试在perl中编写一个正则表达式以匹配此行

    PTTO/ETTO/PROO State  NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA     

Here "PTTO/ETTO/PROO State " is constant and line must start with that after that there could be PO,EO,PRO followed by whitespace. Then the same pattern of any one of PO,EO,PRO followed by whitespace repeats.

我正在尝试将此行与此正则表达式匹配,并且匹配

PTTO/ETTO/PROO State  NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+

但它与下面的正则表达式不匹配。

PTTO/ETTO/PROO State  (NA|PO|EO|PRO\s+){14}

有人可以解释一下我在哪里错了吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

嗯,简短的回答是 - 我不会尝试用正则表达式来做这件事。

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

while (<>) {

   next unless m{^PTTO/ETTO/PROO State};
   my ( undef, undef, @stuff ) = split;
   print Dumper \@stuff;

   my @invalid = grep { not m/^(?:NA|PO|EO|PRO)$/ } @stuff;
   if (@invalid) {
      print "Invalid values: @invalid\n";
   }
   else {
      print "Line matches\n";
   }
}

这样您首先将行拆分为字段,然后针对正则表达式单独检查每个字段。

答案 1 :(得分:1)

你的正则表达式不正确,这个:

(NA|PO|EO|PRO\s+){14}

允许NAPOEOPRO +一个或多个空格,14次(https://regex101.com/r/rEc16C/3)。你想要的是:

((?:NA|PO|EO|PRO)\s+){14}

允许NAPOEOPRO,以及一个或多个空格14次(https://regex101.com/r/rEc16C/2)。