2012-03-13 383 views
1

我正在使用QRegExp并尝试查找QString是否包含某种模式。没有编译错误,但在运行时通常不会发现匹配的情况。我在Python shell中测试了regexp,并与Python进行了匹配。我检查了Qt文档,语法与我使用的ergexp相同。下面是代码示例正则表达式与Qt - indexIn(常量QString&)不能按预期方式工作

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; 
    } 

这种方法被称为在此另一种方法:(!m_func)

无效事情:: setConstraints(QStringList中& constraints_) { 如果 回报;

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

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

在VS2010关注,错误lB1.indexIn(cstr_)是:错误:参数列表不匹配函数。

其次,我想isConstraint()方法来开始使用此检查和更换的空格:

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

如何进行避免的const_cast?

感谢和问候。

编辑--------- 需要在C双键反斜杠++ - 从Python的不同。 TKS!

回答

3

我想你问了两个问题,所以我会尽力回答:

1)你的正则表达式很可能不及格,因为你需要逃避你反斜线使C++不弄乱你的字符串。例如:

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

2)避免使用的const_cast,你可以改变你的函数签名这样的:

bool Thing::isConstraint(QString cstr_) 

或使cstr_对象的副本,并在副本上操作来代替。


作为一个侧面说明,你可能想看看的QRegExp::exactMatch()功能,省却了使用^$在所有的表达式的开始和结束,并且还具有布尔返回值会使您的if报表更清晰一些。

相关问题