C ++字符串拆分但转义引号中的所有分隔符

时间:2017-01-19 10:34:37

标签: c++ regex csv stl

使用C ++,我想分割字符串的行(在本例中为CSV文件),其中某些字段可能包含转义的分隔符(使用“”),应该被视为文字。我已经看过已经提出的各种问题,但没有找到我问题的直接答案。

CSV文件数据示例:

Header1,Header2,Header3,Header4,Header5
Hello,",,,","world","!,,!,",","

分割后所需的字符串向量:

["Hello"],[",,,"],["world"],["!,,!,"],[","]

注意:CSV仅在数据列数等于标题列数时有效。

更喜欢非增强/第三方解决方案。效率不是优先事项。

修改 从@ClasG实现正则表达式的代码至少满足上面的场景。我正在起草边缘测试案例,但很想知道它何时/何​​地发生故障......

std::string s = "Hello,\",,,\",\"world\",\"!,,!,\",\",\"\"";    
std::string rx_string = "(\"[^\"]*\"|[^,]*)(?:,|$)";
regex e(rx_string);
std::regex_iterator<std::string::iterator> rit ( s.begin(), s.end(), e );
std::regex_iterator<std::string::iterator> rend;

while (rit!=rend) 
{
    std::cout << rit->str() << std::endl;
    ++rit;
}    

2 个答案:

答案 0 :(得分:1)

这不是一个完整的(c ++)解决方案,而是一个可能会让你朝着正确的方向努力的正则表达式。

这样的正则表达式
("[^"]*"|[^,]*)(?:,|$)

将匹配各列。 (请注意,它不会处理转义的引号。)

See it here at regex101

答案 1 :(得分:1)

这不是答案,但作为评论恕我直言太久了。

CSV是一种看似简单但实际上非常恶劣的存储格式。

你正在寻找的机器人是Boost.Spirit。

Spirit Master的名字(堆栈溢出)是@sehe。

请在此处查看答案:https://stackoverflow.com/a/18366335/2015579

请相信,而不是我。