如何匹配字符串中的相同模式(一行)并再次执行相同的操作

时间:2014-12-05 09:58:55

标签: regex perl bioinformatics

假设$dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt"

我想在每个aaaa& cccc在你的字符串中 并换上新的一条线。例如,我想要

aaaa
ccccttttaaaaggggaaaa
cccccaaaaggggaaaa
cccctttttttt

我的代码:

 if ($DNA =~ /(.*)$match(.*)/) { # $match would be aaaacccc together
               my $fragment1 = $1.$pre-match; # pre-match is aaaa
               my $fragment2 = $post-match.$2; # post-match is cccc
               print"$fragment1\n$fragment2\n";

我想减少每场比赛。

非常重要,只有匹配后才能切断dna。必须有赛前

让我知道我做错了什么。谢谢

3 个答案:

答案 0 :(得分:1)

这将做你想要的:

$dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt";
$dna =~ s/(.*?)(cccc.*?)/$1\n$2/g;

print "$dna\n";

正则表达式会在每cccc

之前添加换行符

输出:

aaaa
ccccttttaaaaggggaaaa
cccccaaaaggggaaaa
cccctttttttt

答案 1 :(得分:0)

一种解决方案是拆分字符串并将其与"\n"

连接
use warnings;
use strict;
use 5.01;

my $dna = "aaaaccccttttaaaaggggaaaacccccaaaaggggaaaacccctttttttt";
my ($split_left, $split_right) = ('aaaa','cccc');

say join "\n", split /(?<=$split_left)(?=$split_right)/, $dna;

匹配后匹配和预匹配是perl中的预定义术语,表示最后一次匹配前后的整个字符串(您可以通过/p${^PREMATCH}使用${^POSTMATCH}标记访问它们。此外,perl中的变量名称不能包含-,因为它是运算符,而是使用_或camelCasing。

答案 2 :(得分:0)

我认为最简单的方法是使用替换添加换行符:

$dna =~ s/aaaacccc/aaaa\ncccc/g;