C ++多重拆分字符串

时间:2016-10-08 06:13:00

标签: c++ string vector split delimiter

我试图拆分我收到的一些数据,数据是这样的:

0010|chocolate|cookie;458|strawberry|cream;823|peanut|butter;09910|chocolate|icecream

所以首先我需要分割food的每个部分(与&#34 ;;"分开),然后只获取包含ID部分的food部分关于它的"chocolate",问题是数据不是静态的,因此我无法预测出现food "chocolate"部分的次数。

以下是我分割食物部分并获取数据中部分数量的代码:

#include <string>
#include <sstream>
#include <vector>
#include <iostream>
#include <fstream>
using namespace std;

vector<string> &split(const string &s, char delim, vector<string> &elems)
{
    stringstream ss(s);
    string item;
    while (getline(ss, item, delim))
    {
        elems.push_back(item);
    }
    return elems;
}
vector<string> split(const string &s, char delim)
{
    vector<string> elems;
    split(s, delim, elems);
    return elems;
}

char* data = "0010|chocolate|cookie;458|strawberry|cream;823|peanut|butter;09910|chocolate|icecream";

int main()
{
    vector<string> food = split(data, ';');
    cout << number of food sections is : " << food.size();

    return 0;
}

它有效,但现在我希望它在所有部分中阅读并列出哪些部分包含&#34;巧克力&#34;就像:

0010|chocolate|cookie
09910|chocolate|icecream

然后只列出包含chocolate的部分的ID,这可能与我使用的相同分割矢量有关。

0010
09910

2 个答案:

答案 0 :(得分:0)

尝试使用函数在delim分隔的字符串中查找单词,如下所示:

bool find(string vfood, string s, char delim)
{
   std::istringstream to_find(vfood);
   for (std::string word; std::getline(to_find, word, delim); ) if (word == s) return true; 
   return false;
}

然后你可以在每一串食物中找到你想要的任何食物&#39;

vector<string> food_with_chocolate;

for (string &s : food)
{
    if (find(s, "chocolate", '|')) food_with_chocolate.push_back(s);
}

答案 1 :(得分:0)

这取决于您的数据有多丰富。最终你必须抛出一个递归下降解析器。但这似乎更简单。

分号可以逃脱吗?如果没有,那就去,每次你打一个分号,把索引存储在一个不断增长的向量中。这会让你记录开始。然后逐步完成记录。创建一个临时字符串,其中包含记录到分号,然后搜索字符串“chocolate”。如果匹配,则id是记录中的第一个字段,因此直到第一个字段字符。