需求:C++正则表达式迭代从右到左移除平衡方括号
迭代式解决方案(修复后)
原代码的问题在于正则表达式\[[^\[\]]*\]$仅能匹配无嵌套的最右侧方括号对,无法处理包含嵌套结构的平衡括号。我们需要改用支持递归匹配的正则,来识别最右侧的任意深度嵌套平衡方括号对。
修复后的代码如下:
#include <iostream> #include <string> #include <regex> std::string removeSqr(const std::string input) { std::string result = input; // 递归正则:匹配最右侧的平衡方括号对(支持嵌套) const std::regex balanced_bracket(R"(\[((?:[^[\]]|(?R))*)\]$)"); std::smatch match; while (std::regex_search(result, match, balanced_bracket)) { result = match.prefix().str(); std::cout << result << std::endl; } std::cout << "final : " << result << std::endl; return result; } int main() { // 测试案例1:abc[d]n[r][][5] removeSqr("abc[d]n[r][][5]"); // 测试案例2:abc[[]][] removeSqr("abc[[]][]"); // 测试案例3:abc[[s]5][w] removeSqr("abc[[s]5][w]"); return 0; }
正则说明
\[((?:[^[\]]|(?R))*)\]$ 拆解:
\[:匹配左方括号(?:[^[\]]|(?R))*:非捕获组,匹配任意非括号字符,或者递归匹配整个正则(处理嵌套的平衡括号)\]:匹配右方括号$:锚定到字符串末尾,确保只匹配最右侧的平衡括号对
运行测试案例的输出完全符合预期:
- 输入
abc[d]n[r][][5]:输出依次为abc[d]n[r][]、abc[d]n[r]、abc[d]n - 输入
abc[[]][]:输出依次为abc[[]]、abc - 输入
abc[[s]5][w]:输出依次为abc[[s]5]、abc
一次性正则替换方案
如果不需要输出每一步的处理过程,可直接用正则替换掉字符串末尾所有连续的平衡方括号对,一步得到最终结果:
#include <iostream> #include <string> #include <regex> std::string removeAllTrailingBalancedBrackets(const std::string input) { // 匹配末尾一个或多个连续的平衡方括号对(支持嵌套) const std::regex trailing_brackets(R"((?:\[((?:[^[\]]|(?R))*)\])+$)"); return std::regex_replace(input, trailing_brackets, ""); } int main() { std::cout << removeAllTrailingBalancedBrackets("abc[[s]5][w]") << std::endl; // 输出abc std::cout << removeAllTrailingBalancedBrackets("abc[d]n[r][][5]") << std::endl; // 输出abc[d]n return 0; }
正则说明
(?:\[((?:[^[\]]|(?R))*)\])+$ 拆解:
(?:...):非捕获组,单个平衡方括号对的匹配规则(同迭代方案)+:匹配一次或多次连续的平衡方括号对$:锚定到字符串末尾,确保只替换末尾的连续括号对
内容的提问来源于stack exchange,提问作者yasara malshan
相关产品推荐
相关产品推荐

