PHP正则之递归匹配

标签: PHP应用 PHP Recursive pattern regular 正则 | 发表时间:2011-09-30 13:20 | 作者:雪候鸟 KnightE
出处:http://www.laruence.com

我记得早前有同事问, 正则是否能处理括号配对的正则匹配.

比如, 对于如下的待匹配的字符串:

   ((()))

就是一个括号配对的字符串. 而对于如下的待匹配字符串:

   ((()

则不是一个括号配对的字符串.

在以前, 这种情况, 正则无法处理, 最多只能处理固定层数的递归, 而无法处理无线递归的情况… 而在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提供的帮助 :)


Comments

  • 2011/09/30, CFC4N writes: PHP的正则递归(又称迭代)这个特性,在5.2版本已经支持了吧。不清楚5.2的版本用的是PCRE那个版本。最早是php的版本支持的不清楚。是不是PHP5就开始支持了? 我觉得这种递归匹配字符串的事情,最好不要用正则去实现,尽量程序+算法实现,正则去做的话,回溯太多了,很容易引起 回溯太多,引爆了堆栈,类似http://www.laruence.com/2010/06/08/1579.html 这里的问题。
  • 2011/09/30, 雪候鸟 writes: @CFC4N 恩, 有可能, 不过我是最近才发现的, 惭愧, :)
  • 2011/09/30, sunshinehao writes: 有错字。无限递归打成了无线递归

Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)

Related Posts:

相关 [php 递归 匹配] 推荐:

PHP正则之递归匹配

- KnightE - 风雪之隅
作者: Laruence(. 本文地址: http://www.laruence.com/2011/09/30/2179.html. 我记得早前有同事问, 正则是否能处理括号配对的正则匹配. 比如, 对于如下的待匹配的字符串:. 在以前, 这种情况, 正则无法处理, 最多只能处理固定层数的递归, 而无法处理无线递归的情况… 而在perl 5.6以后, 引入了一个新的特性: Recursive patterns, 使得这种需求可以被正确的处理..

PHP导出excel

- syeye - scofield PHP开发-SEO SEM
最近做一个项目,其中涉及到了数据导成excel的功能. 后来使用了 开源的 PHPExcel  http://phpexcel.codeplex.com/ 目前最新版是1.7.6. PHPExcel 可以生成 .xls 和 .xlsx (office2007). 比如设置 excel的title,keywords,description.

PHP框架 Yaf

- Le - 开源中国社区最新软件
Yaf是一个C语言编写的PHP框架,Yaf 的特点: 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存. 更短的内存周转周期, 提高内存利用率, 降低内存占用率. 支持全局和局部两种加载规则, 方便类库共享.

PHP RFC: 让PHP的foreach支持list

- 三马 - 风雪之隅
本文地址: http://www.laruence.com/2011/07/13/2110.html. 上个月, 终于算加入了PHP developer team, 一直以来最大的障碍就是语言, 现在想起来, 当年真应该更加认真努力的去学习英语.. 得到的第一个任务是: 解决一个feature request, 请求在allow foreach($array as list($a,$b).

PHP开发宝典-PHP基础

- - CSDN博客推荐文章
.