php zhegnze PHP正則之遞迴匹配

2021-10-13 04:10:06 字數 703 閱讀 8315

我記得早前有同事問, 正則是否能處理括號配對的正則匹配.

比如, 對於如下的待匹配的字串:

就是乙個括號配對的字串. 而對於如下的待匹配字串:

則不是乙個括號配對的字串.

在以前, 這種情況, 正則無法處理, 最多只能處理固定層數的遞迴, 而無法處理無線遞迴的情況... 而在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)#

Linux 正則 擴充套件正則

基礎正規表示式 以什麼什麼開頭 m 以什麼什麼結尾 m 還表示空行,或空格,可以用cat an 試一下 空行 什麼符號都沒有 表示任意 乙個字元 轉義字元不解析特殊符號的含義 n 相當於回車鍵 t 相當於tab鍵 表示前乙個字元連續出現了0次或0次以上 表示任意字元,包括空行,正規表示式表示所有或連...

正則 正則方法 1103

元字元 0 9 a z 子表示式 0 9 乙個0 9的數值 a z 乙個a z的字元 乙個以上 模式修正符 gi g 全域性匹配 i 不區分大小寫var str 123abcdefgh4abcdefgh 匹配乙個數字 var patt 0 9 全域性匹配乙個數字 var patt 0 9 g匹配乙個...

python正則 python正則表達

正規表示式是一種用來匹配字串的強有力的 設計思想是用一種描述性的語言來給字串定義乙個規則,凡是符合規則的字串,就認為它 匹配 否則就不匹配。一 可以通過幾類符號設計限定規則,常用的思想如下 匹配除換行符以外的任意字元 w匹配字母 數字 下劃線或漢字 w匹配字母 數字 下劃線或漢字以外的字元 s匹配任...