簡體   English   中英

找到某個單詞后如何解析數字

[英]How to parse number after finding some word

我想解析下面提到的 JSON 並從中提取 productionYear 值

    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 failed\n";
    }

    if (it != last)
        std::cout << "Remaining input: '" << std::string(it, last) << "'\n";
}

住在 Coliru

輸出:

Parsed: 1999
Remaining input: '
    }'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM