同一定界符之间的多个子字符串

时间:2018-09-29 00:01:27

标签: c++ parsing substring extract

我是C ++的新手,想知道如何在同一定界符之间从单个字符串中提取多个子字符串?

例如。

  

“ {{”“ id”:“ 4219”,“ firstname”:“ Paul”),(“ id”:“ 4349”,“ firstname”:“ Joe”),(“ id”:“ 4829”, “ firstname”:“ Brandy”)}“

我想要ID:

  

4219,4349,4829

2 个答案:

答案 0 :(得分:3)

您可以使用正则表达式来匹配ID:

#include <iostream>
#include <regex>

int main() {
    // This is your string.
    std::string s{ R"({("id":"4219","firstname":"Paul"),("id":"4349","firstname":"Joe"),"("id":"4829","firstname":"Brandy")})"};

    // Matches "id":"<any number of digits>"
    // The id will be captured in the first group
    std::regex r(R"("id"\s*:\s*"(\d+))");

    // Make iterators that perform the matching
    auto ids_begin = std::sregex_iterator(s.begin(), s.end(), r);
    auto ids_end = std::sregex_iterator();

    // Iterate the matches and print the first group of each of them
    // (where the id is captured)
    for (auto it = ids_begin; it != ids_end; ++it) {
        std::smatch match = *it;
        std::cout << match[1].str() << ',';
    }

}

See it live on Coliru

答案 1 :(得分:1)

好吧,这是问与答的技巧:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::string s{ "{(\"id\":\"4219\",\"firstname\":\"Paul\"),"
                    "(\"id\":\"4349\",\"firstname\":\"Joe\"),"
                    "(\"id\":\"4829\",\"firstname\":\"Brandy\")}"
    };
    std::string id{ "\"id\":\"" };

    for (auto f = s.find("\"id\":\""); f != s.npos; f = s.find(id, f)) {
        std::istringstream iss{ std::string{ s.begin() + (f += id.length()), s.end() } };
        int id; iss >> id;
        std::cout << id << '\n';
    }
}

可靠吗?好吧,只是希望没人给孩子起名"id":" ...