C ++多拆分字符串

Posted

技术标签:

【中文标题】C ++多拆分字符串【英文标题】:C++ Multi-split a string 【发布时间】:2016-10-08 06:13:00 【问题描述】:

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

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

所以首先我需要分隔food 的每个部分(用“;”分隔),然后只获取包含"chocolate"ID 部分的"chocolate",问题是数据不是静态的,所以我无法预测带有"chocolate"food 部分会出现多少次。

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

#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;

它有效,但现在我希望它阅读所有部分并列出哪些部分包含“巧克力”,例如:

0010|chocolate|cookie
09910|chocolate|icecream

然后只列出我上面包含chocolate 的部分的 ID,这可能与我使用的相同拆分向量是可能的。

0010
09910

【问题讨论】:

最好使用正则表达式 std::regeex 来做到这一点 【参考方案1】:

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

分号可以转义吗?如果没有,请继续,每次点击分号时,将索引存储在一个不断增长的向量中。这给你记录开始。然后逐步浏览记录。创建一个由分号之前的记录组成的临时字符串,然后搜索字符串“chocolate”。如果匹配,则 id 是您记录中的第一个字段,因此直到第一个 |字符。

【讨论】:

实际上我发布的代码是这样做的,直到浏览记录的部分,这就是问题所在,我不知道如何在所有记录中找到chocolate 遍历所有“记录”(记录由分号分隔),为每条记录创建一个临时字符串,然后搜索子字符串“chocoloate”。这给了你一切。【参考方案2】:

尝试使用函数在由 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;

然后你可以在每一个“食物”字符串中找到你想要的任何东西

vector<string> food_with_chocolate;

for (string &s : food)

    if (find(s, "chocolate", '|')) food_with_chocolate.push_back(s);

【讨论】:

以上是关于C ++多拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

c#如何将2D数组拆分为较小的2D数组(块)列表?

Emacs学习笔记:多窗口操作

BZOJ4650&UOJ219优秀的拆分(二分,hash)

字符串拼接

单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二

C/C++ 并行搜索 算法