[QA] 如何匹配允许嵌套任意深度的对称括号 ?

news/2025/2/21 19:57:47/文章来源:https://www.cnblogs.com/bitlogic/p/18730051
  1. 如何匹配对称的括号,且允许单层嵌套 ?

    • 就像匹配一个允许包含转义字符的字符串一样,"[^\\"]*(\\.[^\\"]*)*",这是我们常用的一种正则结构 Unrolling the Loop,即opening normal* (special normal*)* closing;类似的,我们可以很容易地构造出匹配允许单层嵌套的对称括号的正则表达式:\([^()]*(\([^()]*\)[^()]*)*\)
  2. perl程序为例,如何指定允许嵌套的深度$depth

    • 实际上,若已有匹配括号文本的正则表达式\([^()]*\),其不允许嵌套;那么用递归的思想,则有\(([^()]|\([^()]*\))*\),此正则表达式也可以用来匹配允许单层嵌套的对称括号。为了便于阅读,书写如下:

      my $Level0 = qr/ \(   [^()]*              \) /x; # Parenthesized text
      my $Level1 = qr/ \(  ([^()] | $Level0 )*  \) /x; # One level of nesting
      my $Level2 = qr/ \(  ([^()] | $Level1 )*  \) /x; # Two levels of nesting
      my $Level3 = qr/ \(  ([^()] | $Level2 )*  \) /x; # Three levels of nesting
      my $Level4 = qr/ \(  ([^()] | $Level3 )*  \) /x; # Four levels of nesting
      my $Level5 = qr/ \(  ([^()] | $Level4 )*  \) /x; # Five levels of nesting
      
    • 对此归纳一下,我们便可以得到允许指定嵌套深度$depth的正则表达式:

      $regex = '\(' . '(?:[^()]|\(' x $depth . '[^()]*' . '\))*' x $depth . '\)';
      
  3. 如何匹配允许嵌套任意深度的对称括号

    • 依据上述,若正则表达式支持递归结构(?R),则\((?:[^()]|(?R))*\)便可以用来递归匹配允许嵌套任意深度的对称括号;我们也可以把开头和结尾的\(\)移动到递归结构(?R)的两端,即 (?:[^()]|\((?R)\))*,这样,正则表达式就会变得十分灵活,因为它不包含外部的\(\),所以在任何可能出现嵌套括号的地方都能使用。
    • 实际案例,例如 Stack Overflow Answer,提问者想匹配pow(var,2),但是var表达式中还可能嵌套任意深度的对称括号:先添加外部的openingclosing,即pow\s*\(,\s*2\s*\),然后用我们的(?:[^()]|\((?R)\))*来填充var部分即可;此时不能再用(?R)来递归引用整个正则表达式,我们需要添加括号来捕获组,并将(?R)修改为相应的捕获 ID,即((?:[^()]|\((?1)\))*);完整的正则表达式为:pow\s*\(((?:[^()]|\((?1)\))*),\s*2\s*\)

相似的问题:Regular expression to match balanced parentheses、PHP \[(?:[^][]|(?R))*\];然而事实上,大多数的正则方言都不支持递归匹配,如 .NET (?R) & Balancing Group,若不使用平衡组/递归匹配可以参考 Match nested brackets with regex without using recursion or balancing groups,或者你可以编写一段程序来实现相同的功能。


Reference:

  • 《Mastering Regular Expressions, 3rd Edition》
  • Stack Overflow: What does this regex mean? [FAQ]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【飞书】Zabbix 7.2 告警与飞书机器人深度联动的全流程

midnight, the sound of a phone buzzing wakes you up abruptly. "又是告警!"你猛地从床上坐起,眼睛酸涩地盯着手机屏幕。作为一名运维工程师,这样的场景几乎成了家常便饭。无论是深夜还是清晨,系统故障总能找到你的联系方式,仿佛在提醒你:科技24小时不眠不休…

Windows平台上Idea、Tomcat、浏览器页面显示乱码问题解决

核心:乱码问题是由于字符编码不一致导致的,所以解决乱码问题的核心概念是统一字符编码。首先我们查看各个平台的字符编码: Windows cmd中输入chcp 命令查看(Windows系统默认字符编码时GBK)936 代表 GBK 65001 代表 UTF-8 注意:通过chcp命令如 chcp 65001 来更改字符编码只…

关于 xrlong 是神的论证

xrlong orz搜索内容搜索结果__________________________________________________________________________________________本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18729881

idea插件+cursor使用技巧

cursorignore配置# Compiled files *.class *.jar *.war# Build directories target/ build/# IDE files .idea/ *.iml .vscode/ .project .classpath .settings/# Logs *.log logs/# Temporary files *.tmp *.bak *.swp# Maven specific .mvn/ mvnw mvnw.cmd# Spring Boot spe…

设计测试用例方法 -经验方法(三种)

1、基于经验的测试技术之错误推测法 错误推测法也叫错误猜测法,就是根据经验猜想,已有的缺陷,测试经验和失败数据等可能有什么问题并依此设计测试用例2、基于经验的测试技术之异常分析法 系统异常分析法就是针对系统有可能存在的异常操作、软硬件缺陷引起的故障进行分析,依…

DeepSeek 即将发布 5 个开源项目;Cartesia Voice Changer:声音转换、克隆和实时语音翻译丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

Spring复习-注解开发

@Component 基本Bean注解,主要是使用注解的方式替代原有xml的 标签及其标签属性的配置使用@Component 注解替代标签使用:再类上使用 @Component(value = "userDao") //若没有配置value,默认使用类名作为beanName public class UserDaoImpl implements UserDao { }…

测试用例编写技巧

一、用例模板 模板1:模板2:模板3:二、用例的来源 (1)公司就有模板 (2)自己设计模板 (3)用例管理工具种导出模板 三、写用例的核心要素 用例编号、用例标题、前置条件、用例步骤,预期结果、优先级(必填) 系统名称、模块名称、用例创建时间、用例类型、实际结果、执行…

利用deepseek,体验ai写代码

vscode利用cline接入火山引擎deepseek,免费体验ai写代码。注册火山引擎,开通deepseek服务进行火山引擎官网https://www.volcengine.com/,进行注册。进入控制台,访问火山方舟在左侧下拉菜单选择开通管理,开通模型,由于我已经开通过R1模型,以DeepSeek-R1-Distill-Qwen-32B…

测试用例编写

模板1:模板2:模板3:二、用例的来源(1)公司就有模板(2)自己设计模板(3)用例管理工具种导出模板三、写用例的核心要素用例编号、用例标题、前置条件、用例步骤,预期结果、优先级(必填)系统名称、模块名称、用例创建时间、用例类型、实际结果、执行时间(非必填项)四…

TEN 现已接入智谱 GLM-Realtime丨社区来稿

就在上周,三星 Galaxy S25 系列全球首发。基于最新 Galaxy AI 的三星 Galaxy S25 系列手机是三星在全球范围内首次推出具有视频通话功能的原生 AI 智能硬件产品。三星 Galaxy S25 系列背后的智谱最新实时音视频通话 GLM-Realtime 模型,今天已经以插件形式接入 TEN。现在你可以…

Canvas._left will be removed, DO NOT USE IT

问题:SignaturePad 手绘板,在电脑端可以绘制,在小程序端绘制以后不显示。开发者工具打印日志:Canvas._left will be removed, DO NOT USE IT.原因:真机使用时确实无法获取该canvas的实例属性_left.解决:通过微信小程序的wx.createSelectorQuery()方法得到query筛选器,通…