C++ 使用boost::split拆分字符串

C++ 使用boost::split拆分字符串,c++,boost,C++,Boost,我是boost库的新手,正在尝试使用boost::split拆分以下字符串: std::string line1 = R"(1500,"Rev, H., Tintin, K.H. Ken",204400,350)"; 我正在尝试将上述字符串拆分为: { "1500", "Rev, H., Tintin, K.H. Ken", "204400", "350"} 我不能使用逗号,作为拆分的分隔符,因为引号内的项可能包含逗号。有没有办法指定使用任何regexp忽略引号内的分隔符?仅使用标准库:

我是boost库的新手,正在尝试使用
boost::split
拆分以下字符串:

std::string line1 = R"(1500,"Rev, H., Tintin, K.H. Ken",204400,350)";
我正在尝试将上述字符串拆分为:

{ "1500", "Rev, H., Tintin, K.H. Ken", "204400", "350"}

我不能使用逗号
作为拆分的分隔符,因为引号内的项可能包含逗号。有没有办法指定使用任何regexp忽略引号内的分隔符?

仅使用标准库:

#include <iostream>
#include <sstream>
#include <iomanip>

int main() {
    std::istringstream line1(R"(1500,"Rev, H., Tintin, K.H. Ken",204400,350)");

    char ch;
    struct { int id;
        std::string full_title;
        int64_t some;
        int64_t data;
    } record;

    if ( (line1 >> record.id) 
      && (line1 >> ch && ch == ',')
      && (line1 >> std::quoted(record.full_title))
      && (line1 >> ch && ch == ',')
      && (line1 >> record.some)
      && (line1 >> ch && ch == ',')
      && (line1 >> record.data))
    {
        std::cout << "Parsed: \n";
        std::cout << "  record.id = " << record.id << "\n";
        std::cout << "  record.full_title = " << record.full_title << "\n";
        std::cout << "  record.some = " << record.some << "\n";
        std::cout << "  record.data = " << record.data << "\n";
    }
}
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

struct Record {
    int id;
    std::string full_title;
    int64_t some;
    int64_t data;
};

BOOST_FUSION_ADAPT_STRUCT(Record, id, full_title, some, data)

namespace qi = boost::spirit::qi;

int main() {
    using It = std::string::const_iterator;
    qi::rule<It, std::string()> quoted = '"' >> *('\\' >> qi::char_ | ~qi::char_('"')) >> '"';
    qi::rule<It, Record()> parser = qi::skip(',') [qi::int_ >> quoted >> qi::int_ >> qi::int_];

    std::string const line1(R"(1500,"Rev, H., Tintin, K.H. Ken",204400,350)");

    Record record;
    if (parse(line1.begin(), line1.end(), parser, record))
    {
        std::cout << "Parsed: \n";
        std::cout << "  record.id = " << record.id << "\n";
        std::cout << "  record.full_title = " << record.full_title << "\n";
        std::cout << "  record.some = " << record.some << "\n";
        std::cout << "  record.data = " << record.data << "\n";
    }
}
使用助推精神:

#include <iostream>
#include <sstream>
#include <iomanip>

int main() {
    std::istringstream line1(R"(1500,"Rev, H., Tintin, K.H. Ken",204400,350)");

    char ch;
    struct { int id;
        std::string full_title;
        int64_t some;
        int64_t data;
    } record;

    if ( (line1 >> record.id) 
      && (line1 >> ch && ch == ',')
      && (line1 >> std::quoted(record.full_title))
      && (line1 >> ch && ch == ',')
      && (line1 >> record.some)
      && (line1 >> ch && ch == ',')
      && (line1 >> record.data))
    {
        std::cout << "Parsed: \n";
        std::cout << "  record.id = " << record.id << "\n";
        std::cout << "  record.full_title = " << record.full_title << "\n";
        std::cout << "  record.some = " << record.some << "\n";
        std::cout << "  record.data = " << record.data << "\n";
    }
}
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

struct Record {
    int id;
    std::string full_title;
    int64_t some;
    int64_t data;
};

BOOST_FUSION_ADAPT_STRUCT(Record, id, full_title, some, data)

namespace qi = boost::spirit::qi;

int main() {
    using It = std::string::const_iterator;
    qi::rule<It, std::string()> quoted = '"' >> *('\\' >> qi::char_ | ~qi::char_('"')) >> '"';
    qi::rule<It, Record()> parser = qi::skip(',') [qi::int_ >> quoted >> qi::int_ >> qi::int_];

    std::string const line1(R"(1500,"Rev, H., Tintin, K.H. Ken",204400,350)");

    Record record;
    if (parse(line1.begin(), line1.end(), parser, record))
    {
        std::cout << "Parsed: \n";
        std::cout << "  record.id = " << record.id << "\n";
        std::cout << "  record.full_title = " << record.full_title << "\n";
        std::cout << "  record.some = " << record.some << "\n";
        std::cout << "  record.data = " << record.data << "\n";
    }
}

用于教育目的的可能重复的可能重复的易于拆分的正则表达式:[a-zA-Z0-9.](?:[a-zA-Z0-9.\s]*),|\w\d+更好的一个[^\s](?:[^,]*),它起作用了。谢谢大家。