2011-12-09 30 views
0

(這是排序的後續問題one I asked before匹配不同的圖案爲一個字符串

所以我有一個DNA串

例如

acagatgaaggaggacgcgcccccgccgctgtcctgcgcctcagccatcctatgagacgg 

和我有20個不同的3字母模式(每個組合對應一個氨基酸)我想匹配的數據。我的java程序一次只查看3個字母,並嘗試將它與其中一個模式相匹配。我想最終計算每個氨基酸出現的次數,所以當我找到一個匹配時,我需要增加一個特定的計數器。我想實現這個用java正則表達式,所以我有:

Pattern A = Pattern.compile("(gct)|(gcc)|(gca)|(gcg)"); 
Pattern C = Pattern.compile("(tgt) | (tgc)"); 
Pattern D = Pattern.compile("(gat) | (gac)"); 

不過,我現在認識到,你需要爲每個模式的匹配,你不能用一個匹配器搜索所有模式;對於我來說,實現我想要做的事情的最佳方式是什麼?

+0

你知道邊界在你的字符串中?這是每封第三封信嗎?如果你不知道,我認爲正則表達式會因一些模式重疊的事實而變得複雜。例如,從上面字符串中的第17個字符開始,您有'gcgcc' - 這將匹配從第一個位置開始的'gcg',但也會匹配從第三個位置開始的'gcc'。這些匹配共享字符串中的第二個g,所以我懷疑這實際上是表示這些位置中的兩種不同的酸。 –

+0

user1058210,讓他們做你的GC04課程真的不是很酷,你應該自己動手做。和平! – StrangeLondoner

回答

0

試試看

String dna = "acagatgaaggaggacgcgcccccgccgctgtcctgcgcctcagccatcctatgagacgg"; 

Pattern p = Pattern.compile("(gct)|(gcc)|(gca)|(gcg)"); 
Matcher m = p.matcher(dna); 

int count = 0; 
while(m.find()) { 
    count ++; 
} 
0

比化您正則表達式:

(gc[tcag]|(tg|ga)[tc]) 
1

我不會在這裏使用正則表達式。你有四個字母,因此4^3 = 64可能的三聯體。只需在字符串上循環,將每個三元組翻譯爲它的編號(a -> 0, c -> 1, g -> 2, t -> 3,所以gcc -> 2*4^2 + 1*4^1 + 1*4^0 = 37),增量counter[number]並忽略最後不想要的那些。 (如果您還想要的位置,它可能是值得檢查當前三重是否是一個想插入到相應的列表,以節省一些空間之前。)

0

你可以使用一個表達式,如

(?<gc>gc[tcag])|(?<tg>tg[tc])|(?<ga>ga[tc]) 

但是,你不能對字符串使用正則表達式。它會給你很多誤報。

字符串中唯一有效的氨基酸是GAT GCC和GCT,如果對字符串使用正則表達式,最多可以找到11個結果。

所以你首先需要將字符串分成3個字符組,然後使用正則表達式來匹配它的模式。

嘗試正則表達式:

(?<gc>gc(?=[tcag]))|(?<tg>tg(?=[tc]))|(?<ga>ga(?=[tc])) 

對您的字符串,它會拿出11個結果。不是你想要的。

要小心你所希望的,你可能會得到它。(或更多,那麼你想要的)

Dim dna As String = "acagatgaaggaggacgcgcccccgccgctgtcctgcgcctcagccatcctatgagacgg" 
    Dim pattern As New ArrayList 
    For x = 0 To dna.Length - 1 Step 3 
     Dim match As Match = Regex.Match(dna.Substring(x, 3), "(?<gc>gc[tcag])|(?<tg>tg[tc])|(?<ga>ga[tc])") 
     If match.Success Then 
      pattern.Add(match.Value) 
     End If 
    Next 

這會給你4個結果

GAT - GCC - GCC - GCT

匹配所有3個有效氨基酸的