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

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

先来个最简单的正则表达式递归

字符串 :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'

';

print_r($matches);

echo'

';

?>

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

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

为了清晰, 我格式化一下/

\(#看到这里的转义左括号没有? 这里是入口, 意味着这个正则会从左括号开始匹配

(#这里是分组用

(

[^()]*|(?R)#这里就是递归, 相当于[^()]*|(\((([^()]*| 递归....

)*#这对括号加上一个星 * 表明, 我要重复递归这件事.

)

\)

/

相对于这行字符串: some text (aaa(b(c1)(c2)d)e)(test) more text

过程是这样的(用 Word 搞了一番):

ab7653affab982b574eb7acc55df2e04.gif

你看第八步, 是否有疑问?

为什么 "第二个对应右括号" 前面的 d 也被匹配了呢?

答案: 因为正则的第二个星号, 第二个星号做的事情是重复这个星号前面括号的内容, 也就是还没到 "第二个对应右括号" 之前, 这个'd'被星号重复匹配了 .

简而言之就是: 匹配左括号 匹配文字 或者 递归 (这一块吃掉后面的对对括号的内容, 其实我管你递归怎么搞, 你搞完后, 之后的在我这一层级就按我的来) 匹配右括号

来源: https://blog.csdn.net/technofiend/article/details/49906755

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值