如果还不明白正则表达式中(?:)的使用,请看:http://www.knowsky.com/297.html

正则表达式的终极能力 - 递归

今天在QQ问liuzhi如何写一个匹配递归式的正则表达式时,没想到那家伙居然就回答“递归消除”,让我去看编译原理的书。(nnd,他肯定想到正则表达式的实现去了...)

找遍了正则表达式的语法都没发现和递归有关或者可以间接用来实现递归的,不过今天在硬盘找到一个电子书(只有一章),居然有讲解了这个。窃喜,记录之。

例子是:

\((?>[^()]+|\((?)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)

这个是匹配有效的最多括号的语法,比如:

before (nope (yes (here) okay) after

匹配到的是:(yes (here) okay)

简单翻译了下这个文档:

匹配嵌套的构造
微软公司已经包含了一个有趣的创新来匹配稳定的构造(历史上,这是正则表达式所做不到的)。这并不容易掌握 — 尽管这节较短,但是注意,它非常的晦涩难懂。
从一个例子开始可能更简单一些,所以我用这段代码作为开始:
Regex r = new Regex(@"\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)");
这能匹配到首个完全配对的括号组,比如"before (nope (yes (here) okay) after"里面的"(yes (here) okay)"。注意第一个左括号没有被匹配到,因为没有和它匹配的右括号。
下面是它如何运作的概览:
1、在每个"("被匹配到的时候,"(?<DEPTH>)"在这里加上一,告诉正则表达式系统当前括号嵌套的深度( 正则表达式开头的"\("不包括在这里)。
2、在每个")"被匹配到的时候,"(?<-DEPTH>)"从深度值内减一。
3、"(?(DEPTH)(?!))"保证在匹配最后一个右括号之前深度为零。
它能工作的原因在于引擎的回逆堆栈保存了匹配成功的组的轨迹。"(?<DEPTH>)"不过是一个带有名称的分组构造,它将总是匹配成功(不匹配任何东西)。而由于它被紧接着放在"\("之后,它的成功匹配(仍然在堆栈上直到被移除)被用于左括号的计数。
译注:还有一种写法是"(?<DEPTH>\()",我个人比较喜欢这种形式,而不是"\((?<DEPTH>)"。后面的"\)(?<-DEPTH>)"也是一样。
这样,匹配成功了的名为"DEPTH"的分组的计数在回逆堆栈上被建立起来。而当找到右括号的时候我们还希望从深度值减一,这是由.NET特别的语法构造 "(?<-DEPTH>)"实现的,它将从堆栈上移除最近匹配的"DEPTH"分组。如果堆栈上已经没有记录,"(?<- DEPTH>)"分组匹配失败,从而防止了正则表达式系统匹配多余的右括号。
最后,"(?(DEPTH)(?!))"是一个用于"(?!)"的断言,如果"DEPTH"分组到目前为止还是成功的话。如果当我们匹配到这里时还是成功 的,这里有个未配对的左括号还没有被"(?<-DEPTH>)"移除。在这种情况,我们希望停止匹配(我们不希望匹配一个未配对的括号),所 以我们使用"(?!)",它是一个“零宽度负预测先行断言”,仅当子表达式不在此位置的右侧匹配时才继续匹配。
这就是在.NET的正则表达式实现中匹配嵌套结构的方法。

匹配嵌套的构造(较复杂)相关推荐

  1. python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构

    unutbu.. 14 编辑: falsetru的嵌套解析器,我稍微修改为接受任意正则表达式模式来指定分隔符和项目分隔符,比我原来的re.Scanner解决方案更快更简单: import re def ...

  2. 【LeetCode】4月1日打卡-Day17-括号匹配/嵌套深度

    题1 有效括号的嵌套深度 题解 要求划分出使得最大嵌套深度最小的分组,我们首先得知道如何计算嵌套深度.我们可以通过栈实现括号匹配来计算: 维护一个栈 s,从左至右遍历括号字符串中的每一个字符: 如果当 ...

  3. python字典嵌套字典构造_浅析python 字典嵌套

    为什么需要嵌套? 有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套 .你可以在列表中嵌套字典.在字典中嵌套列表甚至在字典中嵌套字典. 字典列表 例如:字典alien_0包含 ...

  4. python字典嵌套字典构造_python实现字典嵌套列表取值

    python实现字典嵌套列表取值 如下所示: dict={'log_id': 5891599090191187877, 'result_num': 1, 'result': [{'probabilit ...

  5. python3 正则表达式 嵌套表格_在Python中将嵌套结构与正则表达式匹配

    喵喵时光机 falsetru的嵌套解析器(我稍作修改以接受任意正则表达式模式以指定分隔符和项目分隔符)比我的原始re.Scanner解决方案更快,更简单:import redef parse_nest ...

  6. 正则匹配承兑的html,正则匹配闭合HTML标签(支持嵌套)

    原标题:正则匹配闭合HTML标签(支持嵌套) 任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题.关于正则 ...

  7. .net c# 正则表达式 平衡组/递归匹配

    平衡组/递归匹配 这里介绍的平衡组语法是由.Net Framework支持的:其它语言/库不一定支持这种功能,或者支持此功能但需要使用不同的语法. 有时我们需要匹配像( 100 * ( 50 + 15 ...

  8. AAAI 2020 开源论文 | 用于深度立体匹配的自适应单峰匹配代价体滤波

    ©PaperWeekly 原创 · 作者|张承灏 学校|中科院自动化所硕士生 研究方向|深度估计 本文介绍北航和深动科技在 AAAI 2020 上的论文 Adaptive Unimodal Cost ...

  9. nc65语义模型设计_文本匹配方法系列––多维度语义交互匹配模型

    摘要 本文基于接着多语义匹配模型[1]和BERT匹配模型[2]介绍一些多维度语义交互匹配模型,包括2017 BiMPM模型[3]和腾讯出品的2018 MIX[4].这些方法的核心特征都是在多语义网络的 ...

最新文章

  1. MDA:模型驱动架构 简介
  2. B-Trees Concepts B-树介绍(都快忘了:))
  3. 生态篇-HBase 生态介绍
  4. 对于五个问题的思考与感想
  5. python写appium测试用例找控件的方法总结
  6. centos6.8下安装破解quartus prime16.0以及modelsim ae安装
  7. python学习路线----天池龙珠计划Python训练营task1~3
  8. 本周数据与上周对比应如何表达_互联网运营中的数据分析方法
  9. ML《决策树(二)C4.5》
  10. 什么时候学习编程都不晚
  11. 使用Navicat Premium 同步 测试数据库 与 正式数据库 数据
  12. 简述Git(Linux、Android~~开源)
  13. 如何使用HTML制作个人网站( web期末大作业)
  14. 软件工程之系统架构图和系统架构描述
  15. s5p4418摄像头程序使用教程
  16. 融云直播 SDK 2.0 上线,轻松获得视频直播能力
  17. ubuntu 16.04 Clion2018.1.1 添加桌面快捷方式
  18. 【AutoCAD For Mac 手动删除步骤】
  19. 计算机一级ps考级知识,Photoshop等级考试一级大纲
  20. 使用MTS加快mysql奔溃后binlog恢复

热门文章

  1. java获取网络图片_有了这50套Java毕设项目(源码 案例),offer拿到手软,无偿分享...
  2. html 选中状态,html默认选中状态
  3. 自定义日历控android,Android 一个日历控件的实现小记
  4. linux tcb,在Linux中从潜藏密码迁移至tcb怎么做?
  5. 百度地图API如何申请?(自认为比较详细,如解决了你的问题请收藏、点赞、关注!)
  6. Redis分布式锁实战
  7. android表白app
  8. poj1062昂贵的聘礼(Dijkstra**)
  9. android 版本更新工具类_报表分析工具FastReport .Net 2021年超大版本更新,实现了对.NET 5的支持...
  10. mysql修改表的字段_mysql修改表字段学习笔记