在没有递归或平衡组的情况下匹配嵌套括号
使用正则表达式匹配嵌套括号可能具有挑战性,特别是在像 Java 这样的语言中,其中递归且不支持平衡组。幸运的是,使用前向引用确实可以克服此限制。
匹配外部组
以下正则表达式 [1] 匹配外部组括号而不对深度施加限制:
(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)
这里,表达式向前查找左括号,排除不匹配的左括号,并捕获相应的右括号。捕获的子字符串虽然无用,但可以作为占位符来完成匹配。 ]
匹配内部组要包含内部组,我们可以捕获以下表达式
[2]:(?=\()( ?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(? !.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))
(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))工作原理
该方法迭代字符串,匹配下一个左括号和右括号,而捕获每种情况下的剩余字符串。前瞻确保括号以平衡的方式匹配。
表达式的构造如下:
Description | |
---|---|
断言 '(' 优先于复杂解析 | |
重复字符串处理的非捕获组的开始 | |
断言下一个'('跟随在 | |
?\1)匹配直到下一个 '(' 后面不跟有组 1 | |
\2).*用字符串填充第 1 组,确保另一个 ')' 存在 | |
断言匹配的 ')' 有效 | |
?\2)断言组 2 后面不存在下一个 ')' | |
用剩余的字符串填充组 2 | |
断言匹配的 ')' 有效 | |
使用单个字符继续匹配组 | |
重复组(在内循环中) | |
匹配并包括找到的最后一个“(” | |
1*(?=\2 $)匹配到最后一个')'(但在有效组内) |
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3