c++oding="utf-8" ?>
最直接的方式是循环调用 find 和 erase,每次找到 "..." 后从原位置重新搜索以处理重叠匹配(如 "...."),或设 pos += 3 加速非重叠场景;也可用 regex_replace 一步替换,但性能较差;高性能场景推荐手动双指针遍历。

用 std::string::erase 配合 std::string::find 循环删除
省略号("...")是连续三个英文句点,不是 Unicode 水平省略号("…"),这点必须先确认。如果目标只是删掉所有 ASCII 形式的 "...",最直接的方式是循环查找并擦除。
注意:不能边 find 边 erase 时不更新搜索起始位置,否则会跳过重叠匹配(比如 "...." 包含两个 "...",但一次擦除后剩余部分若不从原位置重查,就会漏掉第二个)。
- 每次调用
find传入当前搜索起点,找到后用erase(pos, 3) - 擦除后,下一轮搜索起点设为
pos(不是pos + 1),因为擦除可能暴露出新的前置匹配 - 若不需要处理重叠(如明确输入中不会出现
"...."),可设为pos + 3加速
std::string s = "a...b....c";
size_t pos = 0;
while ((pos = s.find("...", pos)) != std::string::npos) {
s.erase(pos, 3);
// 重叠场景:保留 pos 不加偏移;非重叠可写 pos += 3
}
// 结果:"abc"(对 "...." 删除两次得 "")
用 std::regex_replace 一步替换(C++11 起支持)
正则适合模式明确、且可能扩展需求的场景,比如将来要同时删 ".." 或带空格的 " . . . "。但要注意:默认 std::regex 在部分标准库实现(如 libstdc++)中性能较差,小字符串不划算。
- 基本写法:
std::regex_replace(s, std::regex("\.\.\."), "")—— 点号需转义 - 若想兼容全角省略号
"…"(U+2026),得额外加分支:std::regex("(?:\.\.\.|\u2026)"),但需确保编译器和 locale 支持 UTF-8 字符串字面量 - Windows 上 MSVC 的
std::regex对 Unicode 支持弱,建议避免在跨平台项目里依赖它处理非 ASCII 省略号
手动遍历字符数组(零依赖、最高性能)
当字符串很长、或处于性能敏感路径(如日志预处理、高频解析),手写循环比 STL 算法或正则快一个数量级,且完全可控。
- 用两个指针:
read扫描,write写入有效字符 - 每遇到三个连续
'.',read跳过它们,write不动;否则拷贝字符 - 最后用
s.resize(write)截断 - 注意边界:检查
read + 2 再判断是否为 <code>"..."
std::string s = "x...y...z";
size_t write = 0;
for (size_t read = 0; read
<h3>误把 Unicode 省略号当 ASCII 处理是常见盲区</h3>
<p>用户粘贴的文本里经常混有 U+2026(<code>"…"</code>),它在编辑器里看起来和 <code>"..."</code> 几乎一样,但字节序列完全不同:<code>"..."</code> 是三个 <code>0x2E</code>,<code>"…"</code> 是 UTF-8 编码的三字节序列 <code>0xE2 0x80 0xA6</code>。用 <code>find("...")</code> 根本找不到它。</p>
- 用十六进制查看器(如
xxd或 VS Code 的 “Show All Characters”)确认实际字节 - 若需统一处理,先做 UTF-8 解码再匹配,或用 ICU 库;纯 C++ 标准库无轻量级方案
- 简单起见,可先用
std::replace把"…"替换成"...",再走前面任一 ASCII 流程
真正难的不是删掉三个点,而是先搞清你面对的到底是哪三个点。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











