本文主要是介绍C++字符串提取和分割的多种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用...
1.www.chinasem.cn 字符串提取的基本方法
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::getlin编程e(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 (lineStreaphpm >> 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 id6javascript 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++字符串提取和分割的资料请关注China编程(www.chinasem.cn)其它相关文章!
这篇关于C++字符串提取和分割的多种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!