我正试图用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
复制相似问题