正则表达式多浮点

时间:2017-08-09 20:36:14

标签: c++ regex boost

我查看了之前的问题,找到了寻找浮点值的最佳方法。我的问题是我有一行除了一些其他文本外还应包含至少3个浮点值。我想从行中提取前三个浮点值并使用它们。但是,我只能得到boost :: regex给我第一个值。我究竟做错了什么?我想在小数的每一边强制至少一个数字,并强制小数也必须存在。

我的示例输入字符串是

 <body >

<section id="contactform1" class="cform">
        <div class="wrap">
            <h2 class="sendmessagetext">Get in Touch</h2>
  <form name="simp_cont" method="post" action="<?=$_SERVER['REQUEST_URI'];?>#cform1" class="contact" onSubmit="return validateForm(this)">
<input class="input" name="captcha" style="position:absolute; left:-9999px;" id="captcha" type="text" />
<input type="text" name="fname" id="name" placeholder="NAME"><br />
<input type="text" name="phone" id="phone" placeholder="PHONE NUMBER"><br />
<input type="text" name="email" id="email" placeholder="EMAIL ADDRESS"><br />
<input type="text" name="footage" id="footage" placeholder="ESTIMATED SQUARE FOOTAGE">
<textarea class="textarea" name="message" placeholder="COMMENTS"></textarea><br />
<input name="form_name" type="hidden" value="contact_form" /><br />
<button type="submit" id="sliderbutton2" name='submit'>SEND MESSAGE</button>
</form>
<br><br>
        <div class="clear"></div>
</div>
</section>
<img src="https://i.stack.imgur.com/dGkgC.png" />

</body>

我的代码看起来像

"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; } 只有1,它只打印出第一个浮点值。如何获得所有三个值?我确信有一些基本的正则表达式,我误解,但我无法弄明白。

1 个答案:

答案 0 :(得分:0)

我认为你正在使用错误的工具来完成工作。如果您需要解析器,请使用解析器。

毕竟你想要解析数据。有许多有效的实数格式(积极的迹象,科学记数法,NaN和无穷大?)。您希望拥有正确转换的数据,而不是字符串值。

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

所以,这是一个使用Boost Spirit的简单方法:

<强> 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)