Perl正则表达式k-mers功能为c#analog

时间:2013-12-04 16:38:37

标签: c# regex perl

有一个perl函数可以查找并打印输入字符串的所有重叠k-mers。

#!/pkg/bin/perl -w

print "Input the string\n";
$dna = <>;
chomp $dna;
print "Input the length of the window\n"; 
$k = <>;
chomp $k;

while (length($dna) >= $k) {
$dna =~ m/(.{$k})/; 
print "$1 \n";
$dna = substr($dna, 1, length($dna) -1);;
}

我想把它变成一个函数,所以它不是一个字符串,它接收一个字符串列表并获得所有k-mers,所以我尝试的是:

//first try with defined string and k to see if it works
string dna="ATTTGGC\nTGCCTTA\nCGGTATC\nGAAAATT";
dna.Replace("\n", "");  //instead of chomp
int k=3;
while(dna.Length  >= k){
  //here I do not know how to traslate $dna =~ m/(.{$k})/; 
  //print "$1 \n";
  //$dna = substr($dna, 1, length($dna) -1);;
}

将该函数从perl转换为c#的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您应该使用Regex的{​​{3}}方法。

string dna = "ATTTGGC\nTGCCTTA\nCGGTATC\nGAAAATT";
dna = dna.Replace("\n", "");
int k = 3;
var r = new Regex(@"(.{" + k + @"})");
while (dna.Length >= k)
{
    Match m = r.Match(dna);
    Console.WriteLine(m.ToString());
    dna = dna.Substring(1);
}

请注意,由于C#中的字符串是不可变的,因此您必须dna = dna.Replace...才能生效。

这会打印ATTTTTTTG等,就像你的Perl方法一样。这可以重写为更简单的循环和Substring,并完全避免使用正则表达式。