字符串分割函数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 函数实现的比较