理解正则表达式中的(?R)递归

原创 2015年11月18日 14:32:55

先来个最简单的正则表达式递归
字符串 :abc123dsf654wre485wer652
传统作法:\w{3}\d{3}\w{3}\d{3}\w{3}\d{3}\w{3}\d{3}
递归做法:(\w{3}\d{3}|(?R))*

当然这个例子不太合适,只能说明正则的递归用法罢了
其实还可以用(\w{3}\d{3})*

你看递归的好处,精悍短少(有力),传统作法无法比拟。

在网上找了一番正则递归的资料,最终谷歌了一下,还是在PHP官网上面找到我想要的示例。

<?php
$string = "some text (aaa(b(c1)(c2)d)e)(test) more text";
preg_match_all("/\((([^()]*|(?R))*)\)/", $string, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
?>

看了示例之后,瞬间明白了,原理很简单

/\((([^()]*|(?R))*)\)/

为了清晰,我格式化一下

/
    \(    #看到这里的转义左括号没有?这里是入口,意味着这个正则会从左括号开始匹配
        ( #这里是分组用
            (
                [^()]*|(?R)  #这里就是递归,相当于[^()]*|(\((([^()]*|递归....
            )* #这对括号加上一个星*表明,我要重复递归这件事。
        )
    \)
/

相对于这行字符串:some text (aaa(b(c1)(c2)d)e)(test) more text
过程是这样的(用word搞了一番):
这里写图片描述

你看第八步,是否有疑问?
为什么 “第二个对应右括号” 前面的d也被匹配了呢?
答案:因为正则的第二个星号,第二个星号做的事情是重复这个星号前面括号的内容,也就是还没到”第二个对应右括号”之前,这个’d’被星号重复匹配了 。
简而言之就是: 匹配左括号 匹配文字 或者 递归(这一块吃掉后面的对对括号的内容,其实我管你递归怎么搞,你搞完后,之后的在我这一层级就按我的来)匹配右括号

版权声明:本文为博主原创文章,未经博主允许不得转载。

正则表达式--递归匹配与非贪婪匹配

1. 表达式的递归匹配    有时候,我们需要用正则表达式来分析一个计算式中的括号配对情况。比如,使用表达式 "/( [^)]* /)" 或者 "/( .*? /)" 可以匹配一对小括号。但是如果括号...
  • dbigbear
  • dbigbear
  • 2006年12月25日 22:41
  • 3090

正则递归

本文地址: http://www.laruence.com/2011/09/30/2179.html 作者: Laruence 正则是否能处理括号配对的正则匹配. 比如, 对于如下的待匹...
  • lihaiboas1
  • lihaiboas1
  • 2013年01月26日 15:39
  • 759

正则表达式递归写法

注意不要盲目相信以下内容! 不要盲目相信以下内容! 不要盲目相信以下内容! (重要的事情说三遍),虽然以下内容也经过了我的验证,但是我的验证可能有错误的地方,欢迎大家留言告知。希望这篇文章成为你深入探...
  • dcplove
  • dcplove
  • 2016年01月07日 14:35
  • 474

正则表达式原理及引擎简化递归实现

转载请注明作者:phylips@bmy 出处:http://duanple.blog.163.com/blog/static/7097176720098303134160/   概述 ...
  • Bluesilence
  • Bluesilence
  • 2014年09月17日 21:39
  • 1096

正则表达式原理及引擎简化递归实现

转载请注明作者:phylips@bmy 出处:http://duanple.blog.163.com/blog/static/7097176720098303134160/   概述 ...
  • Bluesilence
  • Bluesilence
  • 2014年09月17日 21:39
  • 1096

正则表达式匹配(递归+剑指offer)

正则表达式匹配 参与人数:660时间限制:1秒空间限制:32768K通过比例:14.97%最佳记录:0 ms|8552K(来自  高鹏) 题目描述 请实现一个函数用来匹配...
  • u010579068
  • u010579068
  • 2015年11月02日 18:04
  • 1404

grep技巧(-r):在某一目录下递归[所有子目录]查找某一字串:+文件路径

转自:http://zhumeng8337797.blog.163.com/blog/static/1007689142011350151438/ 在某一目录下递归[所有子目录]查找某一字串: ...
  • minghuiw
  • minghuiw
  • 2014年07月06日 16:00
  • 2109

深入理解Python中的模块、包、递归和正则表达式

博客核心内容:3、Python中的模块 4、Python中内置变量__main__的使用 5、Python中模块的搜索路径 6、Python中的包 7、正则表达式3、Python中的模块模块的...
  • a2011480169
  • a2011480169
  • 2017年06月03日 08:45
  • 869

正则表达式--递归匹配与非贪婪匹配

  • 2011年10月14日 14:23
  • 10KB
  • 下载

正则表达式之平衡组/递归匹配(嵌套匹配)

有时我们需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构,这时简单地使用/(.+/)则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式,懒惰模式...
  • wrq147
  • wrq147
  • 2011年01月15日 16:03
  • 4377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解正则表达式中的(?R)递归
举报原因:
原因补充:

(最多只允许输入30个字)