匹配对称的括号 正则表达式
来源:互联网 发布:会展构图的软件 编辑:程序博客网 时间:2024/05/16 01:37
匹配对称的括号
Matching Balanced Sets of Parentheses
对称的圆括号、方括号之类的符号匹配起来非常麻烦。在处理配置文件和源代码时,经常需要匹配对称的括号。例如,解析C语言代码时可能需要处理某个函数的所有参数。函数的参数包含在函数名称之后的括号里,而这些参数本身又有可能包含嵌套的函数调用或是算式中的括号。我们先不考虑嵌套的括号,你或许会想到「/bfoo/([^])*/」,但这行不通。
秉承C的光荣传统,我把示范函数命名为foo。表达式中的标记部分是用来捕获参数的。对于foo(2,4.0)和foo(somevar,3.7)之类的参数,这个表达式完全没问题。但是,它也可以匹配foo(bar(somevar),3.7),这可不是我们需要的。所以要用到比「[^)]*」更聪明的办法。
为了匹配括号部分,我们可以尝试下面的这些正则表达式:
1. /(.*/) 括号及括号内部的任何字符。
2. /([^)]*/) 从一个开括号到最近的闭括号。
3. /([^()]*/) 从一个开括号到最近的闭括号,但是不容许其中包含开括号。
图5-1显示了对一行简单代码应用这些表达式的结果。
图5-1:三个表达式的匹配位置
我们看到,第一个正则表达式匹配的内容太多(注2),第二个正则表达式匹配的内容太少,第三个正则表达式无法匹配。孤立地看,第三个正则表达式能够匹配‘(this)’,但是因为表达式要求它必须紧接在foo之后,所以无法匹配。所以,这三个表达式都不合格。
真正的问题在于,大多数系统中,正则表达式无法匹配任意深度的嵌套结构。在很长的时间内,这是放之四海而皆准的规则,但是现在Perl、.NET和PCRE/PHP都提供了解决的办法(参见第328、436、475页)。但是,即使不用这些功能,我们也可以用正则表达式来匹配特定深度的嵌套括号,但不是任意深度的嵌套括号。处理单层嵌套的正则表达式是:
「/[^()]*(/([^()]*/)[^()]*)*/)」
这样类推下去,更深层次的嵌套就复杂得可怕。但是,下面的Perl程序,在指定嵌套深度$depth之后,生成的正则表达式可以匹配最大深度为$depth的嵌套括号。它使用的是Perl的“string x count”运算符,这个运算符会把string重复count次:
$regex = '/('.'(?:[^()]|/(' x $depth . '[^()]*' . '/))*' x $depth .'/)';
这个表达式留给读者分析。
引用地址:http://book.51cto.com/art/200801/64658.htm
- 匹配对称的括号 正则表达式
- 正则表达式匹配括号外的符号
- js 正则表达式 匹配括号内的内容
- java正则表达式匹配小括号内的内容
- 正则表达式匹配大括号里面的内容
- 正则表达式匹配中括号中内容
- 正则表达式中匹配字符中括号'['
- 判断表达式的括号是否对称
- 匹配的正则表达式
- 正则表达式的匹配
- 正则表达式的匹配
- 正则表达式的匹配
- 正则表达式的匹配
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
- 两个分页类
- 中文邮址服务进入测试阶段
- 设计模式学习(三)抽象工厂
- ibaitis简介
- amule 支持
- 匹配对称的括号 正则表达式
- AIX系统安装的相关知识
- 配置发布Asp.Net 2.0网站关键步骤
- crontab--定时作业
- 校正算法
- IP地址,子网掩码,子网划分,路由汇总,VLSM,CIDR
- JAVA日期格式问题 SimpleDateFormat方法
- xchat support
- 优化MYSQL连接速度~ 关闭反解析