先來個最簡單的正規表示式遞迴
字串 :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 幫我把這一段解釋下,怎麼看都看不懂 驗...