C++字符串提取和分割的多种方法

 更新时间:2025年03月23日 11:24:28   作者:星途码客  
在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用场景和优缺点,我们将通过多个示例代码逐步讲解,帮助读者掌握字符串处理的技巧,需要的朋友可以参考下

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++ 中字符串提取和分割的多种方法,包括:

  1. 使用 std::istringstream 和 >> 操作符按空格分隔字符串。

  2. 使用 std::getline 处理自定义分隔符和多行输入。

  3. 使用正则表达式处理复杂的字符串匹配任务。

  4. 通过性能优化技巧提高代码效率。

每种方法都有其适用的场景和优缺点,开发者可以根据具体需求选择合适的方法。掌握这些技巧后,你将能够高效地处理各种字符串任务,提升代码的可读性和性能。

以上就是C++字符串提取和分割的多种方法的详细内容,更多关于C++字符串提取和分割的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现双向冒泡排序算法

    C++实现双向冒泡排序算法

    这篇文章主要为大家详细介绍了C++实现双向冒泡排序算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++利用jsoncpp库实现写入和读取json文件

    C++利用jsoncpp库实现写入和读取json文件

    JsonCpp 是一个C++库,允许操作 JSON 值,包括序列化和反序列化到字符串和从字符串反序列化。本文主要介绍了如何利用jsoncpp库实现写入和读取json文件,感兴趣的可以了解一下
    2023-04-04
  • c++项目构成从cmake使用基础详解

    c++项目构成从cmake使用基础详解

    这篇文章主要为大家介绍了c++项目构成,从cmake使用基础开始为大家讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • C语言实现简单猜数字游戏

    C语言实现简单猜数字游戏

    这篇文章主要为大家详细介绍了C语言实现简单猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++中I/O模型之select模型实例

    C++中I/O模型之select模型实例

    这篇文章主要介绍了C++中I/O模型的select模型,实例讲述了I/O模型的用法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • 基于字符串移位包含的问题详解

    基于字符串移位包含的问题详解

    本篇文章是对字符串移位包含的问题的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static )

    这篇文章主要介绍了C++中静态成员函数与静态成员变量(static )的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言练习之数组中素数交换

    C语言练习之数组中素数交换

    这篇文章主要为大家介绍了C语言数组中素数交换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-12-12
  • VC创建进程CreateProcess的方法

    VC创建进程CreateProcess的方法

    这篇文章主要介绍了VC创建进程CreateProcess的方法,涉及VC操作进程的基本技巧,需要的朋友可以参考下
    2015-05-05
  • C语言创建windows窗口实例

    C语言创建windows窗口实例

    这篇文章主要介绍了C语言创建windows窗口实例,本文直接给出实现代码,同时讲解了编码的步骤,需要的朋友可以参考下
    2015-04-04

最新评论