2.14 递归匹配
来源:互联网 发布:淘宝卖家怎么入驻一淘 编辑:程序博客网 时间:2024/05/22 00:42
递归匹配在匹配具有嵌套结构的字符串时特别有效。给定算术表达式((1+2)*(3+4)),该表达式具有嵌套结构。如果需要使用正则表达式检查该表达式的结构是否正确,则使用递归匹配能够解决该问题。
注意:本小节中下面介绍的递归匹配为.NET Framework所支持。
在.NET Framework中,正则表达式用于递归匹配的表达式说明如表2-13所示。
表2-13优先级顺序表
操作符或表达式
说明
(?<name>expression)
把匹配的内容命名为name,并压入堆栈。
(?<-name>expression')
从堆栈中弹出最后压入的命名为name的匹配内容。如果堆栈为空,则当前组匹配失败。
(?(name)yes|no)
如果堆栈上存在命名为name的匹配的内容,则继续匹配yes部分的表达式,否则继续匹配no部分。
(?!)
零宽负向先行断言。由于没有后缀表达式,匹配总是失败。
以下正则表达式能够匹配算术表达式((1+2)*(3+4))。
/([^()]*(((?<bracket>/()[^()]*)+((?<-bracket>/))[^()]*)+)*(?(bracket)(?!))/) (80)
下面是对该正则表达式(80)进行详细分析。
/( # 匹配最外层的左括号;
[^()]* # 匹配最外层左括号后面的、不是括号“()”的内容;
(
(
(?<bracket>/() # 如果匹配到左括号,则命名为bracket,并压入堆栈;
[^()]* # 匹配当前左括号后面的、不是括号“()”的内容;
)+
(
(?<-bracket>/() # 如果匹配到右括号,则弹出命名为bracket的内容;
[^()]* # 匹配右括号后面不是括号的内容
)+
)*
(?(bracket)(?!)) #如果匹配到最外层的右括号前面,则检查堆栈内容是否为空。如果不为空,则匹配失败。
/) #匹配最外层的右括号
使用工具Regex Tester测试正则表达式(80),结果如图所示。
- 2.14 递归匹配
- 正则的递归匹配
- 平衡组/递归匹配
- 平衡组/递归匹配
- 平衡组&递归匹配
- PHP正则之递归匹配
- Regex平衡组/递归匹配
- java 递归实现通配符匹配
- 正则递归匹配闭合标签
- 正则表达式--递归匹配与非贪婪匹配
- 正则表达式--递归匹配与非贪婪匹配
- 正则表达式--递归匹配与非贪婪匹配
- 正则表达式--递归匹配、非贪婪匹配与分组替换
- 正则表达式--递归匹配、非贪婪匹配与分组替换
- 正则表达式之平衡组/递归匹配(嵌套匹配)
- 正则表达式--递归匹配、非贪婪匹配与分组替换
- 判断括号是否匹配的递归与非递归实现
- 关于正则表达式的递归匹配问题
- "80后"相亲面面观 男生找富婆不怕倒插门。80后的特点!你占几样?
- Microformats教程 第3部分
- 转:“机器狗”病毒驱动部分逆向分析注释(C代码)
- 我决定以后只来csdn来投帖,javaeye太垃圾了
- 获取当前打开PPT文档的名字及路径
- 2.14 递归匹配
- 说说大型高并发高负载网站的系统架构
- 以前写的VB版的计算表达式
- #define 的用法
- [转]让人汗然的~
- 2.13 优先级顺序
- 在应用程序中使用 Ajax 的时机
- 2.12 注释
- 给PHP加速,eAccelerator配置和使用指南