C++20正则去重连续指定字符时误删点号与逗号的原因
问题原因与解决方案
你的问题出在正则表达式的逻辑错误上:你写的([.,\\-:!?]){2,}匹配的是连续2个及以上任意指定字符(可以是不同的),而非你需要的连续相同的指定字符。
举个例子,原字符串里的..,,,-是由.、,, -组成的连续序列,都会被这个正则整体匹配,而捕获组$1保存的是这个序列的最后一个字符(也就是-),所以替换后整个序列会变成-,直接丢失了前面的.和,;同理开头的...虽然是相同字符,但如果后续有其他指定字符连在一起,也会被错误合并。
要实现“将连续出现的同一指定字符替换为单个”的需求,正确的正则应该用反向引用锁定重复的是同一个字符:
std::string s{ "...?12 :: 54 ! !! ..,,,- ---" }; const std::regex re(R"(([.,\-:!?])\1+)"); // 使用原始字符串字面量避免转义混乱 s = std::regex_replace(s, re, "$1");
代码说明
- 正则逻辑:
([.,\-:!?])捕获一个指定字符,\1+表示匹配该字符的1次或多次重复,确保只匹配连续相同的指定字符序列。 - 原始字符串字面量:用
R"(...)"包裹正则,可以避免C++字符串中反斜杠的双重转义问题,让正则表达式更直观。
这样处理后,就能得到你预期的结果:.?12 : 54 ! ! .,- -。
内容的提问来源于stack exchange,提问作者ENIAC
相关产品推荐
相关产品推荐

