使用std::regex和[:print:]删除不可打印字符时如何保留\n\t
原有代码的核心问题
- 正则逻辑完全写反:你当前的正则
(^[[:print:]]+)匹配的是字符串开头的连续可打印字符,将其替换为空等于删掉了你要保留的内容,完全不符合需求 - 没有按要求保留
\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
相关产品推荐
相关产品推荐

