我讨厌这样做,但是我几个小时都试图找出正则表达式,所以我终于求助于专家。
-1,AAABO,ABOAO
-2,ABBBO,BABBO
-3,AAACO,ACAAO
-4,ABDDO,BADDO
-5,AAABF,ABFAA
-6,BBBGO,BGBBO
我希望匹配多个子字符串,但只能在逗号之间。
例如:
AA and B would return rows 1,5
BB and O would return 2 and 6
BBB and G would return row 6
AA C and O would return row 3
我会根据需要动态构建它。
第二步是在第二个逗号
之后过滤字符串的开头或结尾例如(开始):
AB would return row 1 and 5
例如(结束):
BO would return row 2 and 6
然后我需要结合所有3个过滤器。
例如
AAA O (contains from 2nd column)
AB (begins with)
O (ends with)
返回第1行
如果需要,我可以多次通过。
我会对任何指导感到高兴。
答案 0 :(得分:3)
你想要正则表达式
/^.*?,(?=[^,]*AAA)(?=[^,]*O).*?,AB.*O$/
带评论
/
^.*?, # consume the first field
(?=[^,]*AAA) # look ahead in the 2nd field for AAA
(?=[^,]*O) # look ahead in the 2nd field for O
.*?, # consume the 2nd field
AB.*O$ # the 3rd field starts with AB and ends with O
/x
你可以像这样生成
sub gen_regex {
my ($begins, $ends, @contains) = @_;
my $regex = "^.*?,"
. join("", map {"(?=[^,]*$_)"} @contains)
. ".*?,$begins.*$ends\$";
return qr/$regex/;
}
my $re = gen_regex('AB', 'O', qw(AAA O));
然后像这样使用它:
while (<>) { say $. if /$re/ }