我正在尝试在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}
有人可以解释一下我在哪里错了吗?
提前致谢
答案 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}
允许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)。