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

2025-03-23 14:50

本文主要是介绍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++ 中字符串提取和分割的多种方法,包括:

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

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

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

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

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

以上就是C++字符串提取和分割的多种方法的详细内容,更多关于C++字符串提取和分割的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于C++字符串提取和分割的多种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153900

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -