加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则递归

发布时间:2020-12-14 02:28:15 所属栏目:百科 来源:网络整理
导读:本文地址: http://www.laruence.com/2011/09/30/2179.html 作者: Laruence 正则是否能处理括号配对的正则匹配. 比如,对于如下的待匹配的字符串: ((())) 就是一个括号配对的字符串. 而对于如下的待匹配字符串: ((() 则不是一个括号配对的字符串. 在以前,这种

本文地址: http://www.laruence.com/2011/09/30/2179.html

作者: Laruence

正则是否能处理括号配对的正则匹配.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读