У меня есть метод в классе, который принимает 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::regex_match
функция. Я скопировал регулярное выражение, поэтому я не знаю, почему оно не работает. Я должен преобразовать регулярное выражение, прежде чем использовать его с boost::regex
или что-то не так в коде?
Я решил.
Я черпал вдохновение из эта почта и я изменил реализацию метода, а не регулярное выражение:
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;
}