我正在处理DNA,RNA和蛋白质序列,而QRegExp
对我来说无法检测是否有效
序列仅包含某些字符。
例如,明确只包含acgt:
seq.contains(QRegExp("[gatc]"))
对我不起作用。我怎么能纠正这个?
答案 0 :(得分:0)
默认情况下QRegExp区分大小写。
QRegExp ( const QString & pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive
您应该添加参数以使其不区分大小写。
答案 1 :(得分:0)
误解OP请求。此解决方案用于查找仅包含所有4个元素的子序列。
由于正则表达式无法计算出现次数,因此您需要检查是否存在任何匹配项。使用2个字符的简短示例:AB和BA。要检查AAABBBAAA。您将需要使用QRegExp(“(AB | BA)”),因为表达式无法搜索排列。因此,寻找每个元素一次的序列,需要进行正则表达式检查(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
答案 2 :(得分:0)
您正在查找序列是否包含 gatc
以外的字符。您也不应该在Qt 5中使用已弃用的QRegExp
。所以:
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
QRegularExpression invalid("[^gatcGATC]");
#else
QRegExp invalid("[^gatcGATC]");
#endif
if (seq.contains(invalid)) {
qDebug() << "invalid sequence!";
...
}