1. 字符串提取的基本方法
1.1 使用 std::istringstream 和 >> 操作符
std::istringstream 是 c++ 标准库中的一个类,它将字符串作为输入流来处理。通过 >> 操作符,我们可以从流中提取以空格分隔的单词或数字。
示例代码
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string s = "id13 id1 id6 id0 id8 id6 id0";
std::istringstream iss(s);
std::string token;
while (iss >> token) {
std::cout << token << std::endl;
}
return 0;
}输出
id13 id1 id6 id0 id8 id6 id0
分析
iss >> token会按空格分隔字符串,逐个提取单词。这种方法适用于字符串中的单词是用空格分隔的简单场景。
1.2 提取 id 后面的数字
如果需要从类似 "id13 id1 id6" 的字符串中提取 id 后面的数字,可以使用 std::string::substr 方法。
示例代码
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main() {
std::string s = "id13 id1 id6 id0 id8 id6 id0";
std::istringstream iss(s);
std::string token;
std::vector<int> ids;
while (iss >> token) {
if (token.substr(0, 2) == "id") {
int id = std::stoi(token.substr(2));
ids.push_back(id);
}
}
for (int id : ids) {
std::cout << id << std::endl;
}
return 0;
}输出
13 1 6 0 8 6 0
分析
token.substr(2)从token的第 2 个字符开始提取子串,跳过"id"。无论
id后面的数字是一位数、两位数还是三位数,substr(2)都能正确提取。这种方法简洁高效,适用于提取固定前缀后的数字。
2. 处理复杂分隔符
2.1 使用 std::getline 自定义分隔符
如果字符串的分隔符不是空格(例如逗号 , 或分号 ;),可以使用 std::getline 并指定分隔符。
示例代码
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main() {
std::string s = "id13,id1,id6,id0,id8,id6,id0";
std::istringstream iss(s);
std::string token;
std::vector<int> ids;
while (std::getline(iss, token, ',')) {
if (token.substr(0, 2) == "id") {
int id = std::stoi(token.substr(2));
ids.push_back(id);
}
}
for (int id : ids) {
std::cout << id << std::endl;
}
return 0;
}输出
13 1 6 0 8 6 0
分析
std::getline(iss, token, ',')会按逗号分隔字符串,逐个提取单词。这种方法适用于处理自定义分隔符的场景。
2.2 处理多行输入
如果输入是多行的,std::getline 也可以按行提取内容。
示例代码
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string s = "id13 id1 id6\nid0 id8 id6\nid0";
std::istringstream iss(s);
std::string line;
while (std::getline(iss, line)) {
std::istringstream linestream(line);
std::string token;
while (linestream >> token) {
std::cout << token << std::endl;
}
}
return 0;
}输出
id13 id1 id6 id0 id8 id6 id0
分析
外层
std::getline按行提取内容。内层
linestream >> token按空格分隔每行的单词。这种方法适用于处理多行输入的场景。
3. 高级字符串处理技巧
3.1 使用正则表达式
c++11 引入了 <regex> 库,支持正则表达式匹配,可以更灵活地处理字符串。
示例代码
#include <iostream>
#include <regex>
#include <string>
#include <vector>
int main() {
std::string s = "id13 id1 id6 id0 id8 id6 id0";
std::regex pattern(r"(id(\d+))");
std::smatch matches;
std::vector<int> ids;
auto words_begin = std::sregex_iterator(s.begin(), s.end(), pattern);
auto words_end = std::sregex_iterator();
for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
std::smatch match = *i;
int id = std::stoi(match.str(1));
ids.push_back(id);
}
for (int id : ids) {
std::cout << id << std::endl;
}
return 0;
}输出
13 1 6 0 8 6 0
分析
使用正则表达式
r"(id(\d+))"匹配id后面的数字。这种方法 功能强大,但语法较复杂,适合处理复杂的字符串匹配任务。
3.2 性能优化
对于大规模数据处理,性能可能成为瓶颈。可以通过以下方法优化:
避免频繁创建和销毁
std::istringstream对象。使用
std::string_view(c++17)减少字符串拷贝。
示例代码
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main() {
std::string s = "id13 id1 id6 id0 id8 id6 id0";
std::istringstream iss(s);
std::string token;
std::vector<int> ids;
ids.reserve(10); // 预分配空间
while (iss >> token) {
if (token.substr(0, 2) == "id") {
int id = std::stoi(token.substr(2));
ids.push_back(id);
}
}
for (int id : ids) {
std::cout << id << std::endl;
}
return 0;
}分析
预分配
ids的空间可以减少动态内存分配的开销。使用
std::string_view可以避免不必要的字符串拷贝。
4. 总结
本文详细介绍了 c++ 中字符串提取和分割的多种方法,包括:
使用
std::istringstream和>>操作符按空格分隔字符串。使用
std::getline处理自定义分隔符和多行输入。使用正则表达式处理复杂的字符串匹配任务。
通过性能优化技巧提高代码效率。
每种方法都有其适用的场景和优缺点,开发者可以根据具体需求选择合适的方法。掌握这些技巧后,你将能够高效地处理各种字符串任务,提升代码的可读性和性能。
以上就是c++字符串提取和分割的多种方法的详细内容,更多关于c++字符串提取和分割的资料请关注代码网其它相关文章!
发表评论