理解正規表示式中的 R 遞迴

2021-07-07 07:05:43 字數 1227 閱讀 3595

先來個最簡單的正規表示式遞迴

字串 :abc123dsf654wre485wer652

傳統作法:\w\d\w\d\w\d\w\d

遞迴做法:(\w\d|(?r))*

當然這個例子不太合適,只能說明正則的遞迴用法罷了

其實還可以用(\w\d)*

你看遞迴的好處,精悍短少(有力),傳統作法無法比擬。

在網上找了一番正則遞迴的資料,最終谷歌了一下,還是在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搞了一番):

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

為什麼 「第二個對應右括號」 前面的d也被匹配了呢?

答案:因為正則的第二個星號,第二個星號做的事情是重複這個星號前面括號的內容,也就是還沒到」第二個對應右括號」之前,這個』d』被星號重複匹配了 。

簡而言之就是: 匹配左括號 匹配文字 或者 遞迴(這一塊吃掉後面的對對括號的內容,其實我管你遞迴怎麼搞,你搞完後,之後的在我這一層級就按我的來)匹配右括號

R中的正規表示式

r中有兩種形式的正規表示式 擴充套件的和perl風格的。在部分函式中允許通過fixed true和perl true來選擇是否使用正規表示式並在perl風格和擴充套件風格中選擇,這些函式包括 grep,grep1,sub,gsub,regexpr,gregexpr,regexec,strsplit等...

R語言正規表示式

本文主要說明r語言的正規表示式,主要是一些簡單的函式和stringr包常用的方法 正規表示式通常被用來檢索 替換那些符合某個模式 規則 的文字。一些r自帶的正則函式 grep,主要引數為匹配規則,待匹配的字串,返回向量中匹配成功的字串的下標 s c 1234abc456 123abcdefabc 返...

正規表示式理解

正規表示式問題 string regex 1 d 2 0 4 d 25 0 5 1 9 d 1 9 1 d 2 0 4 d 25 0 5 1 9 d d 1 d 2 0 4 d 25 0 5 1 9 d d 1 d 2 0 4 d 25 0 5 1 9 d d 幫我把這一段解釋下,怎麼看都看不懂 驗...