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
相关产品推荐
相关产品推荐

