找到一些单词后如何解析数字

How to parse number after finding some word

本文关键字:何解析 数字 单词      更新时间:2023-10-16

我想解析未提及的JSON并从中提取 生产年份值

    auto data = {
        "cars" : [
           {
              "name" : "BMW",
              "engine" : 3.0
           },
           {
              "name" : "Citroen",
              "engine" : 3.6
           },
           {
              "name" : "Ferrari",
              "engine" : 4.2
           }
        ],
        "productionYear" : 1999
    }

我有以下规则:

    using boost::spirit::ascii::string;
    using boost::spirit::omit;
    using boost::spirit::qi::lit;
    using boost::spirit::qi::char_;
    boost::spirit::qi::rule<std::string::iterator, int()> production_;
    production_ = omit[*(char_ - "productionYear") >>
                     lit('"') >> lit(' ') >> lit(':') >> lit(' ')] >> int_;
    int year;
    auto it = data.begin();
    if (boost::spirit::qi::parse(it, data.end(), production_, year))
    {
        std::cout << "Parse finished with succeded status"
                  << std::distance(data.begin(), it);
    }

解析器失败,最后一个迭代器位置:0

谁能告诉我我做错了什么?

免責聲明

不要这样做。使用 JSON 解析器。有很多。你的语法在无数方面都很脆弱。(您将在另一个值内productionYear停止,作为较长键中的部分匹配,作为嵌套/同级对象的属性,UNICODE 转义,转义。您将不允许有效的 JSON 可选空格等(。

请参阅此处,了解在 Spirit 中解析 JSON 所需的条件,以合理程度:https://github.com/sehe/spirit-v2-json/blob/master/json.cpp

*(char_ - "productionYear") 

解析任何文本,直至(但不包括(productionYear

这意味着下一个字符永远不会匹配'"'(因为它是'p'(。

一个直接的解决方法是

#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main() {
    std::string const data = R"({
        "cars": [{
            "name": "BMW",
            "engine": 3.0
        },
        {
            "name": "Citroen",
            "engine": 3.6
        },
        {
            "name": "Ferrari",
            "engine": 4.2
        }],
        "productionYear" : 1999
    })";
    boost::spirit::qi::rule<std::string::const_iterator, int()> production_;
    production_ = qi::omit[+(qi::char_ - "productionYear") >> "productionYear"" >> ' ' >> ':' >> ' '] >> qi::int_;
    int year;
    auto it = data.begin(), last = data.end();
    if (qi::parse(it, last, production_, year)) {
        std::cout << "Parsed: " << year << "n";
    } else {
        std::cout << "Parsed failedn";
    }
    if (it != last)
        std::cout << "Remaining input: '" << std::string(it, last) << "'n";
}

住在科里鲁

输出:

Parsed: 1999
Remaining input: '
    }'