有一个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#的最佳方法是什么?
答案 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...
才能生效。
这会打印ATT
,TTT
,TTG
等,就像你的Perl方法一样。这可以重写为更简单的循环和Substring
,并完全避免使用正则表达式。