регулярное выражение qt для ускорения преобразования регулярных выражений для получения числа из строки

У меня есть метод в классе, который принимает QString и, используя регулярное выражение, возвращает первое число с плавающей запятой (положительное или отрицательное), включенное в строку. Это метод:

float MyClass::getNumberFromQString(const QString &xString)
{
  QRegExp xRegExp("(-?\\d+(?:[\\.,]\\d+(?:e\\d+)?)?)");
  xRegExp.indexIn(xString);
  QStringList xList = xRegExp.capturedTexts();

  if (true == xList.empty())
  {
    return 0.0;
  }  
  return xList.begin()->toFloat();
}

Это работает, но теперь мне нужно избегать Qt и делать то же самое, используя только повышение. Я создал метод с помощью boost, но он не работает:

#include <boost/regex.hpp>
#include <boost/spirit/include/qi.hpp>

// other class methods

float Importer::getNumberFromString(const std::string &sString)
{
  float fElevation = 0.0f;
  boost::regex e("(-?\\d+(?:[\\.,]\\d+(?:e\\d+)?)?)");
  boost::smatch what;
  if(boost::regex_match(sString, what, e, boost::match_extra)) {
    if (false == what.empty()) {
      boost::spirit::qi::parse(what[0].str().begin(), what[0].str().end(), fElevation);
    }
  }
  return fElevation;
}

Проблема в том, что при одинаковом строковом значении обоих методов (например, "lpda_-30.dat") версия Qt работает, а версия boost не выполняет функцию boost::regex_match. Я скопировал регулярное выражение, поэтому не знаю, почему оно не работает. Я должен преобразовать регулярное выражение, прежде чем использовать его с boost::regex, или в коде что-то не так?


person Jepessen    schedule 12.05.2014    source источник


Ответы (1)


Я решил.

Я черпал вдохновение из этого сообщения, и я изменена реализация метода, а не регулярное выражение:

float Importer::getNumberFromString(const std::string &sString)
{
  float fElevation = 0.0f;
  boost::regex e("(-?\\d+(?:[\\.,]\\d+(?:e\\d+)?)?)");
  boost::sregex_iterator it(sString.begin(), sString.end(), e);
  boost::sregex_iterator end;
  if (it != end)
  {
    std::string sValue(it->str());
    boost::spirit::qi::parse(sValue.begin(), sValue.end(), fElevation);
  }
  return fElevation;
}
person Jepessen    schedule 12.05.2014