按','拆分字符串但是使用boost :: split

时间:2016-01-07 10:53:45

标签: c++ boost split

','拆分字符串,但使用boost::split忽略字符串C ++中引号内的文字

示例字符串: "1,a,2,5,"1,2",5"

我希望将其拆分为不同的字符串,如下所示,

String s1 = "1";
String s2 = "a";
String s3 = "2";
String s4 = "5";
String s5 = "1,2";
String s6 = "5";

我可以使用boost :: split吗?

来实现这一点

提前致谢!

3 个答案:

答案 0 :(得分:1)

我不确定您为什么要特别使用boost::split,但由于您已经在使用Boost,为什么不Boost.Spirit?这是使用Spirit X3的快速实现:

std::vector<std::string> csvish_split(std::string const& s)
{
    namespace x3 = boost::spirit::x3;

    auto const quoted   = '"' >> *~x3::char_('"') >> '"';
    auto const unquoted = *~x3::char_(',');
    auto const segments = (quoted | unquoted) % ',';

    std::vector<std::string> ret;
    if (!x3::parse(cbegin(s), cend(s), segments, ret))
        throw std::runtime_error("failed to parse: " + s);
    return ret;
}

<强> Online Demo

如果需要,可以使用Boost.Spirit.QI轻松重写。

答案 1 :(得分:0)

不知道如何通过提升来做到这一点。

#include <iostream>
#include <string>
#include <vector>
std::vector<std::string> split_string(const std::string& s)
{
    std::vector<std::string> splitted;
    bool flag = false;
    splitted.push_back("");
    for(int i=0; i<s.size(); ++i)
    {
        if(s[i]=='\"')
        {
            flag = flag? false : true;
            continue;
        }

        if(s[i]==',' && !flag)
            splitted.push_back("");
        else
            splitted[splitted.size()-1] += s[i];
    }
    return splitted;
}

int main(void)
{
    std::string test = "1,a,2,5,\"1,2\",5";
    std::cout << test << std::endl;
    for(auto& x : split_string(test))
    {
        std::cout << x << std::endl;
    }
}

输出:

1,a,2,5,"1,2",5 
1 
a 
2 
5 
1,2 
5 

答案 2 :(得分:0)

谢谢大家,这很有帮助。我终于使用Boost :: tokenize解决了这个问题。这就是我想要的。