如何选择何时使用逗号拆分字符串



我有一个字符串需要用逗号分隔,但字符串中有一个逗号我不想用它分隔。

所以,我的字符串是:

Let's eat, Granny,Happy,22,Chicken

我想这样拆分:

Let's eat, Granny
Happy
22
Chicken

但我得到的却是:

Let's eat
Granny
Happy
22
Chicken

如何在不弄乱第一个逗号的情况下拆分这个字符串?我确实有一个想法,那就是我想忽略的逗号后面有空格,我可以利用这一点,对吧?如果我错了,请纠正我。

这是我迄今为止写的代码:

string delimiter = ",";
string test = "Let's eat, Granny,Happy,22,Chicken,";
size_t pos = 0;
string token;
while((pos = test.find(delimiter)) !=String::npos){ //position of comma
token = test.substr(0, pos); //read in string at position of comma
}

一个可能的解决方案是使用regex来标记您的字符串:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>
int main()
{
std::vector<std::string> items;
std::string text = "Let's eat, Granny,Happy,22,Chicken";
std::regex comma_re(",(?!\s)",
std::regex_constants::ECMAScript | std::regex_constants::icase);
std::copy( std::sregex_token_iterator(text.begin(), text.end(), comma_re, -1),
std::sregex_token_iterator(),
std::back_inserter(items));
for (const std::string& item : items){
std::cout << item << std::endl;
}
}

现在,您所有分离的项目都在items


正则表达式解释
匹配后面没有空格(?!\s)的逗号,

考虑到您所限制的数据,逗号实际上不是一个可靠的分隔符,除非您能保证任何可忽略的逗号都是,后面总是紧跟空格。如果是这样,你可以这样做:

char delimiter = ',';
string test = "Let's eat, Granny,Happy,22,Chicken,";
size_t start = 0, end;
string token;
do
{
end = test.find(delimiter, start);
while ((end != string::npos) &&
((end+1) < test.size()) &&
(test[end+1] == ' ')) // <-- or: isspace(test[end+1])
{
end = test.find(delimiter, end+2);
}
if (end == string::npos)
token = test.substr(start);
else
token = test.substr(start, end-start);
// use token as needed...
if (end == string::npos)
break;
start = end + 1;
}
while (true);

实时演示

最新更新