регулярное выражение с Qt - indexIn (const QString &) не работает должным образом - PullRequest
1 голос
/ 13 марта 2012

Я использую QRegExp и пытаюсь выяснить, содержит ли QString какой-либо шаблон.Нет ошибки компиляции, но совпадение не идентифицируется во время выполнения, где обычно должна происходить идентификация.Я протестировал регулярное выражение в оболочке Python, и совпадение происходит с 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 & constraints_) {if (! M_func) return;

 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 ??

Спасибо и всего наилучшего.

edit --------- необходимо удвоить обратную косую черту в C ++ - отличается от Python.Tks!

1 Ответ

3 голосов
/ 13 марта 2012

Я думаю, что вы задали два вопроса, поэтому я постараюсь ответить на них:

1) Ваши регулярные выражения, скорее всего, не передаются, потому что вам нужно избежать обратной косой черты, чтобы C ++ не испортил ваши строки. Например:

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

2) Чтобы избежать использования const_cast, вы можете изменить сигнатуру функции на эту:

 bool Thing::isConstraint( QString cstr_)

или сделайте копию объекта cstr_ и используйте вместо него копию.


В качестве примечания, вы можете взглянуть на функцию QRegExp :: correctMatch () , которая устраняет необходимость использования ^ и $ в начале и в конце всех ваших выражений. , а также имеет возвращаемое значение bool, которое сделает ваши операторы if немного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...