DNA、RNA、およびタンパク質配列を扱ってQRegExp
いますが、配列に特定の文字のみが含まれているかどうかを検出することはできません。たとえば、明確には acgt のみが含まれます。
seq.contains(QRegExp("[gatc]"))
私にはうまくいきません。どうすればそれを修正できますか?
OP リクエストの誤解。このソリューションは、4 つの要素すべてを 1 回だけ含むサブシーケンスを見つけるためのものです。
正規表現は出現回数をカウントできないため、一致する可能性があるかどうかを確認する必要があります。AB と BA の 2 文字を使用した短い例。AAABBBAAA がチェックされます。式は順列を検索できないため、 QRegExp("(AB|BA)") を使用する必要があります。したがって、すべての要素を 1 回含むシーケンスを探すには、(ACGT|ACTG|AGCT|....) の正規表現チェックが必要です。
次のようなものを実装する方が簡単です。
QString seq = "gactacgtccttacgaccaacggcgataaaaattgcccgcataagacaactttcgaggcg";
QMap<QChar,int> count;
void resetCounter()
{
count[QChar('a')] = 0;
count[QChar('c')] = 0;
count[QChar('g')] = 0;
count[QChar('t')] = 0;
}
bool checkCounter()
{
foreach(count.values(), int val)
if(val != 1)
return false;
return true;
}
resetCounter();
for(int i=0; i<seq.length(); i++)
{
count[seq.at(i)] = count[seq.at(i)] + 1;
if(count[seq.at(i)] > 1)
{
resetCounter();
count[seq.at(i)] = 1;
}
if(checkCounter())
{
//Found sequence
count[seq.at(i-3)] = 0;
}
}
編集:小さな間違いを見つけました。resetCounter() が呼び出された後、現在の要素を 1 に設定する必要があります