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

使用std::regex和[:print:]删除不可打印字符时如何保留\n\t

原有代码的核心问题

  1. 正则逻辑完全写反:你当前的正则(^[[:print:]]+)匹配的是字符串开头的连续可打印字符,将其替换为空等于删掉了你要保留的内容,完全不符合需求
  2. 没有按要求保留\n和\t两个特殊不可打印字符,也不需要额外增加regex_search判断,regex_replace本身就可以完成全局匹配替换

解决方案

我们的目标是匹配所有「不属于可打印字符、同时不是\n也不是\t」的字符,直接将其替换为空即可,修正后的代码如下:

// 匹配所有既不是可打印字符、也不是换行\n、制表符\t的字符
std::regex nonprintable_regex(R"([^[:print:]\n\t])");
// 全局替换所有匹配到的字符为空
str = std::regex_replace(str, nonprintable_regex, "");

代码说明

  • 这里用了C++11的原始字符串字面量R"()"避免转义问题,你也可以写成普通字符串格式"[^[:print:]\\n\\t]"
  • [^[:print:]\n\t]是否定字符集,会匹配所有不在集合内的字符,也就是你需要删除的\a、\b、\0、\f等其余不可打印字符
  • regex_replace本身会自动扫描整个字符串,匹配不到内容就会原样返回原字符串,不需要额外判断

用你给出的示例输入"\nTesting\t regex and \n\n\t printable characters \a\b set \0\f"运行上述代码,输出结果和你期望的完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:02