我试图创建一个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
答案 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
也许有生物信息学模块可以做到这一点,但我对它们并不熟悉。