You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20中为非分号结尾的换行前添加分号的解决方案

问题与解决方案

问题说明

给定字符串:

A;1;
B;2
C;3

需求是给所有不紧跟在分号;后的换行符前添加一个;,最终结果应为:

A;1;
B;2;
C;3

仅在2后追加;。尝试使用正则表达式时出现错误(如示例代码会在1后生成多余的;),且环境不支持后行断言特性,需解决以下问题:

  • 可行的正则表达式方案
  • 纯C++20实现方案

正则表达式解决方案

可以利用捕获组匹配“非分号字符+换行”的模式,替换为“捕获的字符+分号+换行”,避免后行断言的依赖:

std::string s{ "A;1;\nB;2\nC;3" };
const std::regex re("([^;])\\n");  // 匹配非分号字符后跟换行
s = std::regex_replace(s, re, "$1;\n");

此正则仅匹配换行前字符不是分号的情况,替换时保留原字符并插入分号,不会在已有分号的换行前重复添加,完全符合需求。


纯C++20实现方案

若无法使用正则,可通过遍历字符串直接处理:

#include <string>

std::string add_semicolon_before_newline(std::string s) {
    size_t pos = s.find('\n');
    while (pos != std::string::npos) {
        // 确保换行符不是字符串第一个字符,且前一个字符不是分号
        if (pos > 0 && s[pos - 1] != ';') {
            s.insert(pos, ";");
            pos += 2;  // 插入后换行位置后移1,跳过当前处理的换行
        } else {
            pos = s.find('\n', pos + 1);
        }
    }
    return s;
}

// 使用示例
int main() {
    std::string s{ "A;1;\nB;2\nC;3" };
    s = add_semicolon_before_newline(s);
    // 输出结果:A;1;\nB;2;\nC;3
    return 0;
}

该方法通过find定位所有换行符,逐一检查前导字符,非分号则插入;,同时调整遍历位置避免重复处理,逻辑清晰且无需依赖正则库。


内容的提问来源于stack exchange,提问作者ENIAC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:25:11