给定输入字符串"12a“或"a123",我期望输入"false”、"123a“-> true和result=="a”、"123ab“-> true和result=="ab”等。
这是我的尝试:
#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>
int main(int argc, char* argv[])
{
std::string s(argv[1]) ;
int n = 3;//can be runtime parameter
std::string result;
auto expr = boost::spirit::qi::omit
[
boost::spirit::qi::repeat(n)[boost::spirit::qi::int_]
]
>> +boost::spirit::qi::char_("A-Za-z");
bool b = boost::spirit::qi::phrase_parse(s.begin(), s.end(), expr, boost::spirit::qi::space, result);
std::cout << std::boolalpha << b << '\n';
if(b)
{
std::cout << result << '\n';
}
}
现在,123a、123ab等返回false。
发布于 2018-07-27 20:06:41
boost::spirit::qi::int_
是一个贪婪的解析器,它将在第一次重复使用所有三个数字。
相反,您应该定义自己的整数解析器,该解析器仅使用1位,如下所示:
boost::spirit::qi::uint_parser<unsigned, 10, 1, 1> uint1_p;
使用uint1_p
而不是boost::spirit::qi::int_
编辑:或者...qi::digit
在这里做了同样的事情。
https://stackoverflow.com/questions/51564808
复制