split函数实现

 |
总阅读量


字符串分割函数split,将一个字符串按给定的定界符delim分割成字符串数组。实现的方式多种多样,由浅入深,从易到难,开始分割…

实现的方式有以下3种:

  • 用cstring 库中的strtok函数实现
  • string类对字符串直接处理实现
  • 正则表达式结合STL实现

用strtok函数实现

std::vector<std::string> split0(const std::string &str, const std::string &deli)
{
    std::vector<std::string> out;
    if(str.empty())
    {
        return out;
    }
    if(deli.empty())
    {
        out.emplace_back(str);
        return out;
    }
    // c_str()返回当前string对象的c 风格常量字符串,即const char *
    const char *del=deli.c_str();

    // 将str重新放入流中,再用char数组读取
    std::stringstream ot(str);
    char strTemp[str.size()+1];
    ot>>strTemp;

    char *p=strtok(strTemp,del);
    while(p != nullptr)
    {
        out.emplace_back(p);
        p = strtok(nullptr,del);
    }
    return out;
}

用string类实现

std::vector<std::string> split1(const std::string &str, const std::string &deli)
{
    std::vector<std::string> out;
    if(str.empty())
    {
        return out;
    }
    if(deli.empty())
    {
        out.emplace_back(str);
        return out;
    }
    // 直接处理字符串
    std::string p=str;
    p+=deli;                                // 保证结尾有一个定界符
    size_t cur;                             // 记录处理过的子串
    while((cur = p.find(deli)) != std::string ::npos)
    {
        out.emplace_back(p.substr(0,cur));  // 截取分割子串

        p=p.substr(cur+deli.size());        // 向后滑动
    }
    return out;
}

用std::regex实现

std::vector<std::string> split2(const std::string &str, const std::string &deli)
{
    std::vector<std::string> out;
    if(str.empty())
    {
        return out;
    }
    if(deli.empty())
    {
        out.emplace_back(str);
        return out;
    }

    // 构造定界符正则
    std::regex re(deli);

    // 获取匹配该定界符的串的前缀
    std::sregex_token_iterator p(str.begin(), str.end(), re, -1);
    std::sregex_token_iterator end;

    while (p != end)
    {
        out.emplace_back(*p++);
    }
    return out;
}

完整测试代码见我的Github
参考资料:
C++ Reference
几种c++字符串split 函数实现的比较