最直接的办法是用 std::regex_replace(s, std::regex(r"(\n+)"), "\n");但需注意编译器兼容性、性能及\r\n处理问题,手动双指针遍历更稳妥高效。

用 std::regex_replace 一次性替换所有连续换行符为单个换行符
最直接的办法是把 \n+(一个或多个连续换行符)替换成单个 \n。C++11 起标准库支持正则,但要注意:不同编译器对 std::regex 的实现质量差异大,MSVC 在旧版本中对多字节重复匹配有 bug,GCC/Clang 更稳定。
实操建议:
- 使用
std::regex_replace(s, std::regex(R"(\n+)"), "\n"),R"(\n+)"避免双重转义问题 - 若字符串极大(如 >1MB),正则可能慢且内存开销高;此时应避免此法
- Windows 换行
\r\n不会被\n+匹配到,需单独处理或先统一换行符
手动遍历 + 双指针删除连续 \n(无依赖、零分配、兼容所有平台)
这是最稳妥的方案,不依赖正则,也不修改原字符串语义(比如保留开头/结尾的单个换行)。核心思路是“读写双指针”:跳过连续的 \n,只保留第一个。
示例逻辑(就地修改):
std::string s = "a\n\n\nb\n\nc"; size_t write = 0; for (size_t read = 0; read <p>注意点:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2659" title="C++"><img src="https://img.php.cn/upload/skill/000/000/081/178927213426672.jpg" alt="C++" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill2659" title="C++" class="overflowclass">C++</a> <p class="overflowclass">"空空如也"</p> </div> <a rel="nofollow" href="/xiazai/skill2659" title="C++" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- 必须检查
read + 1 ,否则越界访问 - 该逻辑只压缩
\n,不碰\r;若要处理\r\n,得先用std::replace(s.begin(), s.end(), '\r', '\n')或更严谨地按行规一并归一化 - 如果原字符串不可修改,用
std::string out辅助构造,逻辑相同但更安全
用 std::unique 能不能简化?
不能直接用。因为 std::unique 只去重相邻相等元素,它会把 "\n\n\n" 变成 "\n",看似可行——但副作用严重:它也会把 "aaabbb" 变成 "ab",破坏非换行字符的重复逻辑。
除非你确定字符串里只有换行和非换行两类字符,且非换行字符本身绝不连续(几乎不可能),否则别碰 std::unique。它不是为“仅压缩某类字符连续段”设计的。
跨平台换行符(\r\n vs \n)怎么统一处理?
如果你的输入来自文件或网络,很可能混着 \r\n(Windows)、\n(Unix)、甚至 \r(古 Mac),而需求是“所有连续换行语义压缩为一个换行”。这时必须先标准化。
推荐做法:
- 读入后立刻将所有
\r\n和\r替换为\n:std::replace(s.begin(), s.end(), '\r', '\n');
再处理\n+—— 注意这会把\r\n变成\n\n,所以要先做 - 或者更健壮:用循环查找
"\r\n"子串,全部替换为"\n",再单独处理孤立\r - 别依赖
std::ios_base::binary模式自动转换:那是读取时做的,且只影响\r\n → \n,不反向,也不处理已存在的混合数据
真正麻烦的从来不是“怎么删”,而是“删之前没意识到换行符其实不止一种”。实际项目里,漏掉 \r 处理导致日志解析错位,比算法写错更常见。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










