使用Qt的正则表达式 - indexIn(const QString&)不能按预期工作

时间:2012-03-13 15:27:39

标签: c++ regex qt const

我正在使用QRegExp并尝试查找QString是否包含某些模式。没有编译错误,但在运行时通常不会发生匹配。我在Python shell中测试了regexp,并且在Python中进行了匹配。我检查了Qt doc,我正在使用的ergexp语法是一样的。这是代码示例

 bool Thing::isConstraint(const QString &cstr_)
 {



QRegExp lB1("^(\d+\.?\d*|\d*\.\d+)<=PARAM(\d+)$");
QRegExp lB2("^PARAM(\d+)>=(\d+\.?\d*|\d*\.\d+)$");
QRegExp lB3("^PARAM(\d+)>(\d+\.?\d*|\d*\.\d+)$");
QRegExp lB4("^(\d+\.?\d*|\d*\.\d+)<PARAM(\d+)$");

QRegExp uB5("^(\d+\.?\d*|\d*\.\d+)>=PARAM(\d+)$");
QRegExp uB6("^(\d+\.?\d*|\d*\.\d+)>PARAM(\d+)$");
QRegExp uB7("^PARAM(\d+)<=(\d+\.?\d*|\d*\.\d+)$");
QRegExp uB8("^PARAM(\d+)<(\d+\.?\d*|\d*\.\d+)$");


QRegExp luB9("^(\d+\.?\d*|\d*\.\d+)>=PARAM(\d+)>=(\d+\.?\d*|\d*\.\d+)$");
QRegExp luB10("^(\d+\.?\d*|\d*\.\d+)>PARAM(\d+)>=(\d+\.?\d*|\d*\.\d+)$");
QRegExp luB11("^(\d+\.?\d*|\d*\.\d+)>=PARAM(\d+)>(\d+\.?\d*|\d*\.\d+)$");
QRegExp luB12("^(\d+\.?\d*|\d*\.\d+)>PARAM(\d+)>(\\d+\.?\d*|\d*\.\d+)$");
QRegExp luB13("^(\d+\.?\d*|\d*\.\d+)<=PARAM(\d+)<=(\d+\.?\d*|\d*\.\d+)$");
QRegExp luB14("^(\d+\.?\d*|\d*\.\d+)<=PARAM(\d+)<(\d+\.?\d*|\d*\.\d+)$");
QRegExp luB15("^(\d+\.?\d*|\d*\.\d+)<PARAM(\d+)<=(\d+\.?\d*|\d*\.\d+)$");
QRegExp luB16("^(\d+\.?\d*|\d*\.\d+)<PARAM(\d+)<(\d+\.?\d*|\d*\.\d+)$");

int pos_=0;

if((pos_ = lB1.indexIn(cstr_)) != -1)
{
    m_func->setLowerBound((lB1.cap(2)).toInt(),(lB1.cap(1)).toDouble());
    return true;
}

else if((pos_ = lB2.indexIn(cstr_)) != -1)
{
    m_func->setLowerBound((lB2.cap(1)).toInt(),(lB2.cap(2)).toDouble());
    return true;
}

      /*
         ...
      */
      return false;
   }

此方法在另一种方法中调用:

void Thing :: setConstraints(QStringList&amp; constraints_) {     如果(!m_func)         返回;

 for(int j=0;j<constraints_.size();j++)
{

    if(isConstraint(constraints_.at(j)))
    {
        constraints_.removeAt(j);
    }
}
m_func->setConstraints(constraints_);
 }

在VS2010 Watch中,lB1.indexIn(cstr_)的错误是:错误:参数列表与函数不匹配。

其次,我希望isConstraint()方法从这个检查开始并替换为空格:

     QRegExp wsp ("\s+");
cstr_.replace(wsp,"");

如何继续避免const_cast ??

谢谢和问候。

编辑--------- 需要在C ++中加倍反斜杠 - 与Python不同。 TKS!

1 个答案:

答案 0 :(得分:3)

我想你问过两个问题,所以我会尝试回答这些问题:

1)您的正则表达式很可能不会传递,因为您需要转义反斜杠,以便C ++不会弄乱您的字符串。例如:

QRegExp lB1("^(\\d+\\.?\\d*|\\d*\\.\\d+)<=PARAM(\\d+)$");

2)为避免使用const_cast,您可以将函数签名更改为:

 bool Thing::isConstraint( QString cstr_)

或制作cstr_对象的副本,而不是对副本进行操作。


作为旁注,您可能需要查看QRegExp::exactMatch()函数,该函数无需在所有表达式的开头和结尾使用^$,还可以有一个bool返回值,这将使你的if语句更清晰。