0

我在一个类中有一个方法,它接受一个 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 来做同样的事情。我创建了一个使用 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,否则代码有问题?

4

1 回答 1

0

我已经解决了。

我从这篇文章中获得了灵感,我改变了方法实现,而不是正则表达式:

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;
}
于 2014-05-12T15:29:33.763 回答