协助建立正则表达式

时间:2016-01-23 00:14:00

标签: regex perl

我讨厌这样做,但是我几个小时都试图找出正则表达式,所以我终于求助于专家。

-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行

如果需要,我可以多次通过。

我会对任何指导感到高兴。

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/ }