按','
拆分字符串,但使用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吗?
来实现这一点提前致谢!
答案 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解决了这个问题。这就是我想要的。