2017-08-09 57 views
1

我已经查看了前面的问题以找到查找浮点值的最佳方法。我的问题是我有一行应该包含至少3除了一些其他文字的浮点值。我想从行中提取前三个浮点值并使用它们。但是,我只能得到boost :: regex给我第一个值。我究竟做错了什么?我希望强制小数的每一边至少有一位数字,并强制小数位数也必须存在。正则表达式多重浮点型

我的例子输入字符串是

"this is a name" 39.789876 -83.997978 30.000000 

我的代码看起来像

std::string line = "\"this is a name\" 39.789876 -83.997978 30.000000"; 
static boost::regex llhNums_regex = boost::regex("[-]?[0-9]+[.][0-9]+"); 
boost::smatch resultsTwo; 
if(boost::regex_search(line, resultsTwo, llhNums_regex)) 
{ 
    std::cout << "Found results\n"; 
} 
for(int i = 0 ; i<resultsTwo.size() ; ++i) 
{ 
    std::cerr << i << ": " << resultsTwo[i].str() << std::endl; 
} 

然而resultsTwo.size()只有1和它打印出来只是第一个浮点值。我如何获得所有三个值?我确信有一些基本的东西是我误解的正则表达式,但我无法弄清楚。

+0

对于直接答案的正则表达式的问题:HTTPS:/ /stackoverflow.com/questions/3122344/boost-c-regex-how-to-get-multiple-matches?noredirect=1& lq = 1 – sehe

回答

0

我认为你使用错误的工具来完成这项工作。如果你想要一个解析器,使用一个解析器。

毕竟你想分析数据。实数有许多有效的格式(关于正号,科学记数法,NaN和无穷大?)。你想要正确转换的数据,而不是字符串值。

即使名称包含一个数字(OOOPS),您甚至可能希望拥有该名称或可靠地跳过该名称。

所以,在这里使用的一个简单的方法升压精神:

Live On Wandbox

#include <iostream> 
#include <boost/spirit/include/qi.hpp> 
namespace qi = boost::spirit::qi; 

bool parse_line(std::string const& line, std::string& name, double& a, double& b, double& c) { 
    using It = std::string::const_iterator; 
    qi::rule<It, std::string()> quoted = '"' >> *~qi::char_('"') >> '"'; 

    It f = line.begin(), l = line.end(); 
    return qi::phrase_parse(f, l, quoted >> qi::double_ >> qi::double_ >> qi::double_, qi::blank, name, a, b, c); 
} 

int main() { 
    std::string name; 
    double a, b, c; 

    if (parse_line("\"this is a name\" 39.789876 -83.997978 30.000000", name, a, b, c)) { 
     std::cout << "Parsed: \n" 
      << " Name '" << name << "'\n" 
      << " (a,b,c): (" << a << ", " << b << ", " << c << ")\n"; 
    } 
} 

打印:

Parsed: 
Name 'this is a name' 
(a,b,c): (39.7899, -83.998, 30) 
+0

感谢这工作完美,我认为这比我的正则表达式更好,虽然我不需要担心处理各种形式的浮点数。 – Todd