Perl Regex查找并返回所有可能的匹配项

时间:2018-11-10 08:01:56

标签: regex perl

我试图创建一个while循环,该循环将查找字符串中的每个可能的子字符串。但是到目前为止,我只能匹配最大的实例或最短的实例。例如,我有一个字符串

用于演示目的的编辑更改字符串

"A.....B.....B......B......B......B"

我想找到“ A ....... B”的所有可能序列

这段代码将为我提供最短的返回并退出while循环

while($string =~ m/(A(.*?)B)/gi) {
    print "found\n";
    my $substr = $1;
    print $substr."\n";
}

这将使我最长并退出while循环。

$string =~ m/(A(.*)B)/gi

但是我希望它在返回所有可能匹配项的字符串中循环。有人知道Perl是否允许这样做吗?

下面的编辑所需的预期输出

found
A.....B
found
A.....B.....B
found
A.....B.....B......B
found
A.....B.....B......B......B
found
A.....B.....B......B......B......B

1 个答案:

答案 0 :(得分:2)

解析字符串的方法有很多种,以获取想要的内容。

例如,使用正则表达式逐步遍历所有A...A子字符串并处理每个捕获

use warnings;
use strict;
use feature 'say';

my $s = "A.....B.....B......B......B......B";

while ($s =~ m/(A.*)(?=A|$)/gi) {
    my @seqs = split /(B)/, $1; 
    for my $i (0..$#seqs) {
        say @seqs[0..$i] if $i % 2 != 0;
    }   
}

(?=A|$)是前瞻性的,因此.*会将所有内容匹配到A(或字符串的末尾),但是A不会被使用,因此下一场比赛。 split在分隔符模式中使用(),以便也返回分隔符(因此我们拥有所有这些B)。它仅打印偶数个元素,因此仅子字符串以分隔符(此处为B)结尾。

上面的照片

A.....B
A.....B.....B
A.....B.....B......B
A.....B.....B......B......B
A.....B.....B......B......B......B

也许有生物信息学模块可以做到这一点,但我对它们并不熟悉。