我正试图用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}
有人能解释一下我哪里出了问题吗?
提前谢谢
发布于 2017-05-04 15:32:27
您的正则表达式是不正确的,这是:
(NA|PO|EO|PRO\s+){14}
允许NA
、PO
、EO
或PRO
+一个或多个空白,14次(https://regex101.com/r/rEc16C/3)。不过,你想要的是:
((?:NA|PO|EO|PRO)\s+){14}
它允许NA
、PO
、EO
或PRO
,以及一个或多个空格14次(https://regex101.com/r/rEc16C/2)。
发布于 2017-05-04 15:22:57
好吧,简单的回答是-我不会试图用正则表达式来做这件事。
#!/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";
}
}
这样,首先将行拆分为字段,然后根据正则表达式分别检查每个字段。
https://stackoverflow.com/questions/43786693
复制相似问题