C++如何删除字符串中所有的特定占位符字符串

云杰同学_6066

云杰同学_6066

2026-09-09

870人浏览

原创

c++oding="utf-8" ?>

最可靠方法是用 std::string::find 定位后配合 erase 循环删除,每次从 0 重新查找以处理重叠占位符;regex_replace 适合灵活模式但有性能与兼容性风险;remove_if 仅适用于单字符;大字符串高频删除应考虑构建新串优化。

c++如何删除字符串中所有的特定占位符字符串

std::string::find + std::string::erase 循环删除最可靠

直接调用 std::string::replace 或试图一次正则替换,往往漏删重叠或连续占位符(比如删 "{}" 时,"{{}" 可能只删掉一个)。稳妥做法是用 find 定位起始位置,再用 erase 删固定长度子串,循环直到找不到为止。

注意:每次 erase 后字符串变短,下一次 find 必须从 0 开始(或从上一次位置开始但要处理索引偏移),否则会跳过紧邻的匹配项。常见错误是写成 pos += len 后继续找——这在非重叠场景可行,但不通用。

  • 示例:删掉所有 "%s"
std::string s = "name: %s, age: %s, city: %s";
std::string placeholder = "%s";
size_t pos = 0;
while ((pos = s.find(placeholder, pos)) != std::string::npos) {
    s.erase(pos, placeholder.length());
    // 不加 pos += placeholder.length(),因为 erase 后后续内容已前移
}
// 结果:"name: , age: , city: "
  • 若占位符可能重叠(如删 "aa""aaaa" 中),必须从 0 重启查找,否则只能删两个;从 pos 继续查最多删两个(取决于实现)
  • std::regex_replace 简洁但有隐含开销和限制

    正则适合模式灵活的场景(比如删所有 "{.*?}"),但 C++11 的 std::regex 在部分标准库(如 libstdc++)中性能差、不完全支持 ECMAScript 模式,甚至某些版本有 bug(例如空匹配导致死循环)。不是所有占位符都值得上正则。

    C++
    C++

    "空空如也"

    下载
    • 安全用法:仅用于字面量占位符,且确认编译器/STL 支持稳定
    • 示例:删所有 "{{var}}"(注意花括号需转义)
    std::string s = "Hello {{var}}, welcome to {{place}}.";
    s = std::regex_replace(s, std::regex("\{\{var\}\}"), "");
    // 注意:双反斜杠是 C++ 字符串字面量要求,正则本身只接收 "\{\{var\}\}"
  • 不要用 std::regex_replace(s, std::regex(placeholder), "") —— 占位符含正则元字符(如 ".", "*", "+")会意外匹配
  • std::string::erase 配合 remove_if 仅适用于单字符占位符

    如果“占位符”其实是单个字符(如所有 'X'),可以用 std::remove_if + erase 惯用法,效率高、一行解决。但它对多字符子串完全无效——remove_if 是按字符逐个判断,无法识别子串边界。

    • 正确(删所有 '_'):
    s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return c == '_'; }), s.end());
  • 错误(试图删 "_+"):这个 lambda 只能看到单个 char,永远不知道前后是否构成 "_+"
  • 别被名字误导:remove_if 不真的删除,只是把保留元素前移,必须配 erase 才生效
  • 跨平台或高频调用时,注意 std::string 的内存重分配成本

    频繁擦除(尤其大字符串中大量小占位符)会导致多次内存拷贝。如果确定输入长度和占位符数量,可先统计总删除长度,用 reserve 预留空间;更激进的做法是构建新字符串(用 std::string::append 拼接非占位符段),避免原地擦除的移动开销。

    • 构建新串示例(适合占位符少、原串大):
    std::string result;
    result.reserve(s.length()); // 预估不会比原串长
    size_t start = 0;
    while (true) {
        size_t pos = s.find(placeholder, start);
        if (pos == std::string::npos) {
            result.append(s, start, std::string::npos);
            break;
        }
        result.append(s, start, pos - start); // 复制 [start, pos)
        start = pos + placeholder.length();
    }
  • Linux 上用 std::string 的 SSO(短字符串优化)时,小字符串删几次影响不大;但超过 15–22 字节后就触发堆分配,反复 erase 的代价明显上升
  • 实际删占位符时,多数情况用第一个方法就够了;真正要注意的是占位符是否含正则元字符、是否可能重叠、以及字符串尺寸是否大到值得优化内存操作。其他方案要么不适用,要么引入额外风险。

    C++免费学习笔记(深入):立即使用
    在学习笔记中,你将探索 C++ 的入门与实战技巧!

    相关文章

    PHP速学视频免费教程(入门到精通)
    PHP速学视频免费教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    c++和c语言的区别有哪些
    c++和c语言的区别有哪些

    c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

    2024.03.14

    2068

    9

    c++和python学习顺序推荐
    c++和python学习顺序推荐

    一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

    2024.03.14

    939

    6

    python和c++学习性价比分析
    python和c++学习性价比分析

    Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

    2024.03.14

    367

    5

    c语言和c++一样吗
    c语言和c++一样吗

    c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2024.03.14

    307

    5

    c语言和c++先学哪个好
    c语言和c++先学哪个好

    初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2024.03.14

    346

    5

    c语言和c++的区别和联系
    c语言和c++的区别和联系

    c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2024.03.14

    560

    5

    c++软件中文更改教程
    c++软件中文更改教程

    对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

    2024.03.21

    1389

    9

    python和java和c++学习性价比分析
    python和java和c++学习性价比分析

    Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

    2024.03.22

    1177

    7

    c++和c语言学习顺序推荐
    c++和c语言学习顺序推荐

    对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

    2024.03.25

    1305

    9

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Valgrind Quick Start Guide
    Valgrind Quick Start Guide

    共0课时 | 0人学习

    CLion CMake 快速入门教程
    CLion CMake 快速入门教程

    共0课时 | 0人学习