开发者

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

目录
  • 1. 字符串提取的基本方法
    • 1.1 使用 std::istringstream 和 >> 操作符
      • 示例代码
      • 分析
    • 1.2 提取 id 后面的数字
      • 示例代码
      • 输出
      • 分析
  • 2. 处理复杂分隔符
    • 2.1 使用 std::getline 自定义分隔符
      • 示例代码
      • 输出
      • 分析
    • 2.2 处理多行输入
      • 示例代码
      • 输出
      • 分析
  • 3. 高级字符串处理技巧
    • 3.1 使用正则表达式
      • 示例代码
      • 输出
      • 分析
    • 3.2 性能优化
      • 示例代码
      • 分析
  • 4. 总结

    1.www.devze.com 字符串提取的基本方法

    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++字符串提取和分割的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜