如何仅在以给定整数开头的情况下解析字符串

时间:2018-07-27 20:01:06

标签: c++ parsing boost-spirit

给出输入字符串“ 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。

1 个答案:

答案 0 :(得分:1)

boost::spirit::qi::int_是一个贪婪的解析器,它将在第一次重复中消耗所有三位数字。

相反,您应该定义自己的整数解析器,该解析器将仅消耗1位数字,如下所示:

boost::spirit::qi::uint_parser<unsigned, 10, 1, 1> uint1_p;

并使用uint1_p代替boost::spirit::qi::int_

编辑:或者,是的。qi::digit在这里做同样的事情。