PHP正則之遞迴匹配

2021-06-01 01:58:14 字數 777 閱讀 5482

正則是否能處理括號配對的正則匹配.

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

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

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

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

如果想更多的了解這個新特性, 可以參看:

php zhegnze PHP正則之遞迴匹配

我記得早前有同事問,正則是否能處理括號配對的正則匹配.比如,對於如下的待匹配的字串 就是乙個括號配對的字串.而對於如下的待匹配字串 則不是乙個括號配對的字串.在以前,這種情況,正則無法處理,最多只能處理固定層數的遞迴,而無法處理無線遞迴的情況.而在perl 5.6以後,引入了乙個新的特性 recur...

python 遞迴正則匹配

需要提取 發熱 低熱 37.3 38 c 乏力,腹痛 下腹痛,一側腹痛 中的 發熱,乏力,腹痛 即去除括號內的內容 包含括號,括號可能巢狀 好像可以用 平衡組 遞迴匹配 但不知道怎麼用python實現,用nestedexpr貌似可以實現。from pyparsing import nestedexp...

PHP 正則匹配a標籤

php匹配固定class鏈結的a標籤 使用修飾詞大寫的u轉換為非貪婪模式 要不然會從文中的第乙個a標籤的開頭 匹配到最後乙個a標籤的結尾 c u 還可以直接使用非貪婪的正則.c 這個a標籤不要匹配 asdad str aaa bbbccc c u preg match all c,str,match...