我查看了之前的问题,找到了寻找浮点值的最佳方法。我的问题是我有一行除了一些其他文本外还应包含至少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,它只打印出第一个浮点值。如何获得所有三个值?我确信有一些基本的正则表达式,我误解,但我无法弄明白。
答案 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)