PHP正则之递归匹配
浏览:2703次 出处信息
我记得早前有同事问, 正则是否能处理括号配对的正则匹配.
比如, 对于如下的待匹配的字符串:
- ((())
就是一个括号配对的字符串. 而对于如下的待匹配字符串:
- (((
则不是一个括号配对的字符串.
在以前, 这种情况, 正则无法处理, 最多只能处理固定层数的递归, 而无法处理无线递归的情况… 而在perl 5.6以后, 引入了一个新的特性: Recursive patterns, 使得这种需求可以被正确的处理.
Recursive pattern引入了一个新的符号(?R), 这个符号可以表示: 正则模式本身, 比如:
- #1(?R)*
我们来仔细看一下, 这个正则, 首先它匹配数字”1″, 然后(?R)*表示, 正则式本身, 也就是说, 可以认为是:
- #1(正则本身(正则本身).....)*
于是, 对于文章开头说到的情况:”括号配对”, 可以写下如下的正则式:
- #\((?R)*\)
就可以正确处理.
这里提醒一下, 用的时候, 要注意一定要给递归一个截至条件, 比如如果上面的例子写成:
- #1(?R)
那么, 就不会正常工作, 因为这个展开以后表示要匹配无限多个”1″, 所以在上面的例子中, 写作了(?R)*, 让它可以有一个截止的条件(可以为0个).
另外, 这个新特性也支持序号引用(?index), 比如:
- #(1)(2)(3)(?3)(?2)(?1)
表示匹配, 123321.
如果想更多的了解这个新特性, 可以参看: http://www.php.net/manual/en/regexp.reference.recursive.php
感谢windy, 和shiwei提供的帮助
建议继续学习:
- PHP与递归Recursion (阅读:8229)
- 统计最近用过的linux命令 (阅读:5207)
- grep 正则表达式选项要记得转义 (阅读:5074)
- 正则表达式基础 (阅读:4922)
- 正则表达式的与或非 (阅读:4575)
- 循环、迭代、遍历和递归 (阅读:4431)
- 学习Grep,Sed中的正则 (阅读:3899)
- URL正则表达式 (阅读:3468)
- 正则表达式简要入门 (阅读:3352)
- PHP 正则里面的两个重要技巧 (阅读:3339)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:gen_tcp发送进程被挂起起因分析及对策
后一篇:UyHiP趣题:按照盒子的三边长之和来计费有没有漏洞? >>
文章信息
- 作者:雪候鸟 来源: 风雪之隅
- 标签: 正则 递归
- 发布时间:2011-10-14 13:49:04
建议继续学习
近3天十大热文
- [68] 如何拿下简短的域名
- [68] Go Reflect 性能
- [64] Oracle MTS模式下 进程地址与会话信
- [61] IOS安全–浅谈关于IOS加固的几种方法
- [61] 图书馆的世界纪录
- [60] 【社会化设计】自我(self)部分――欢迎区
- [59] android 开发入门
- [54] 视觉调整-设计师 vs. 逻辑
- [49] 读书笔记-壹百度:百度十年千倍的29条法则
- [47] 界面设计速成