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

c++ boost split

662 观看

3回复

96 作者的声誉

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

样本字符串: "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实现吗?

提前致谢!

作者: quickdraw 的来源 发布者: 2016 年 1 月 7 日

回应 3


0

3362 作者的声誉

不知道如何使用boost tho。

#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 
作者: xinaiz 发布者: 2016 年 1 月 7 日

1

57329 作者的声誉

决定

我不确定为什么要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对其进行简单地重写。

作者: ildjarn 发布者: 2016 年 1 月 8 日

0

96 作者的声誉

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

作者: quickdraw 发布者: 2016 年 1 月 22 日
32x32