std::regex_replace仅能删除最外层括号及内容,处理嵌套需循环调用或手写栈模拟;手动扫描更可靠、高效且无依赖,支持任意括号类型与unicode扩展。

用正则表达式一次性删除所有括号及内容(C++11+)
标准库 std::regex_replace 是最直接的方案,但要注意括号嵌套不支持——它只删最外层匹配到的括号对及其内容。
常见错误是写成 \(.*\),这会贪婪匹配从第一个 ( 到最后一个 ),中间所有内容全被吃掉。正确做法是用非贪婪(虽然 C++ 标准正则不支持 *?),改用否定字符集:
-
std::regex re("\([^()]*\)");—— 只匹配不含嵌套括号的(...) - 循环调用
std::regex_replace直到结果不再变化,才能处理多层嵌套 - 注意:MSVC 2015–2019 的
std::regex实现有 bug,建议换用boost::regex或手动实现
手动遍历 + 栈模拟,可靠处理任意嵌套
当括号可能嵌套(如 "a(b(c)d)e" → "ae"),正则就力不从心了。手写扫描更可控、无依赖、性能好。
核心逻辑是用栈记录左括号位置,遇到右括号就弹出并标记待删区间:
- 遍历字符串,遇
'('入栈索引;遇')'且栈非空,则弹出一个位置,记下这对括号区间 - 所有区间合并去重后,用
std::string的erase或构建新字符串跳过这些范围 - 别忘了处理栈未清空的情况(不匹配的
(),按需决定是否保留原样或报错
示例关键片段:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
std::string remove_parentheses(const std::string& s) {
std::string res;
std::stack<size_t> stk;
std::vector<:pair size_t>> to_remove;
for (size_t i = 0; i second + 1, last - it->second - 1) + res;
last = it->first;
}
res = s.substr(0, last) + res;
return res;
}</:pair></size_t>
只删英文圆括号,还是也处理中文/其他括号?
默认场景指 ASCII 的 '(' 和 ')'。如果输入含中文括号(( / ))、方括号或花括号,必须显式扩展判断逻辑。
容易踩的坑是直接用宽字符或 UTF-8 多字节处理——除非明确要求支持 Unicode,否则先确认输入编码。多数工程场景下,输入是纯 ASCII,硬编码 '(' 和 ')' 更安全高效。
- 若需支持中文括号,把条件改成
s[i] == '(' || s[i] == '('等,但注意char类型无法表示中文,得用std::u8string或第三方库 - 方括号场景(如
[abc])只需把栈操作和匹配字符换成'['/']',逻辑完全复用
性能敏感时,避免多次内存分配
频繁调用 std::string::erase 或拼接子串,会触发多次内存重分配。尤其在长字符串或高频调用中,影响明显。
- 推荐一次遍历生成结果:维护一个输出索引
out_i,只在非删除区间把字符拷贝过去 - 预先 reserve 足够空间(例如
res.reserve(s.length())),避免动态扩容 - 不要用
std::regex处理短字符串(
嵌套深度极大时(比如千层括号),栈可能溢出,但这种情况极少出现在真实数据中;如有风险,可用计数器替代栈(仅适用于单种括号对)。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










