首页  >  文章  >  Java  >  如何在没有递归或平衡组的情况下匹配嵌套括号?

如何在没有递归或平衡组的情况下匹配嵌套括号?

DDD
DDD原创
2024-10-25 02:35:02362浏览

How to Match Nested Brackets Without Recursion or Balancing Groups?

在没有递归或平衡组的情况下匹配嵌套括号

挑战:

匹配一组使用缺少递归和平衡组支持的正则表达式风格任意嵌套括号,例如 Java 的 java.util.regex,捕获给定字符串内的三个外部组:

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))

解决方案:将引用转发到救援

与普遍看法相反,使用前向引用可以匹配没有这些高级功能的嵌套括号:

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)

分解:

这个复杂的正则表达式分两个阶段运行:

  • 第 1 阶段: 前瞻识别平衡括号序列而不消耗字符。此过程一直持续到找到完整的外部组。
  • 第 2 阶段: 捕获组提取匹配的外部组的内容。

工作原理:

  • 检查 '(': 继续遍历字符串,直到遇到 '('。
  • 匹配平衡括号:使用两个前瞻来确保下一个'('和')'以平衡的方式匹配,捕获内部内容。
  • 结束括号检查:检查与之前匹配的 '(' 匹配的结束 ')' 并进一步前进。
  • 外部组结束检查: 确保结束 ' 之前不再出现 '(' )' 的外部组。

内部组匹配变体:

对于匹配内部组,策略保持不变,但使用捕获组将匹配的内容保存在一对平衡的括号内:

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$))) 

全面破坏:

表格总结了正则表达式的组件和功能:

Note Component Description
(?=() Look for '('
(?: Start group for iteration
(?=.?((?!.?1)) Look for '(' not followed by 1, which contains the matched inner content
(.)(?!.2).*)) Capture inner content and check for at least one more ')'
(?=.?)(?!.?3)) Look for ')' not followed by 2, which contains the matched outer content
(. ) Capture outer content
. Consume a character
) Close group
? Match as few times as possible
.*?(?=1) Match up to and including the last '('
1*(?=2$) Match up to the last ')' without encountering more '('

  1. (

以上是如何在没有递归或平衡组的情况下匹配嵌套括号?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn