我正在使用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!
答案 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
语句更清晰。