首页 > Java > java教程 > 正则表达式可以在没有递归或平衡组的情况下匹配嵌套括号吗?

正则表达式可以在没有递归或平衡组的情况下匹配嵌套括号吗?

Patricia Arquette
发布: 2024-10-25 02:37:02
原创
539 人浏览过

Can Regex Match Nested Brackets Without Recursion or Balancing Groups?

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

挑战:
可以使用正则表达式,例如Java的java.util.regex中的那些,可以在不依赖递归或平衡组的情况下匹配任意嵌套的括号?

解决方案:
是的,可以使用前向引用:

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
登录后复制

工作原理:
此表达式由多个前瞻和前向引用组成,它们共同识别嵌套的括号组:

  • (? =() 确保下一个字符是左括号。
  • (?:...) ?.*?(?=...):迭代字符串的非捕获组。
  • (?=.*?((?!.*?1):向前查找不属于已匹配组的下一个左括号(在 1 中捕获)。
  • (.*)(?!.*2).*):捕获字符串的其余部分并匹配至少一个附加右括号。
  • (?=.*?)(?!.*?2 ):向前查找不属于已匹配组的下一个右括号(在 2 中捕获)。
  • .*?(?=1):匹配到并包括找到的最后一个左括号.
  • [^(]*(?=2$):匹配直到找到最后一个右括号,确保它们之间不再有左括号。

示例:
以下字符串将匹配三个嵌套组:

(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))
登录后复制

匹配内部组:
要匹配内部组,可以添加捕获组到表达式末尾:

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
登录后复制

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

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板