遞迴匹配在匹配具有巢狀結構的字串時特別有效。給定算術表示式((1+2)*(3+4)),該表示式具有巢狀結構。如果需要使用正規表示式檢查該表示式的結構是否正確,則使用遞迴匹配能夠解決該問題。
注意:本小節中下面介紹的遞迴匹配為.net framework所支援。
在.net framework中,正規表示式用於遞迴匹配的表示式說明如表2-13所示。
表2-13優先順序順序表
操作符或表示式 說明
(?expression)
把匹配的內容命名為name,並壓入堆疊。
(?expression')
從堆疊中彈出最後壓入的命名為name的匹配內容。如果堆疊為空,則當前組匹配失敗。
(?(name)yes|no)
如果堆疊上存在命名為name的匹配的內容,則繼續匹配yes部分的表示式,否則繼續匹配no部分。
(?!)
零寬負向先行斷言。由於沒有字尾表示式,匹配總是失敗。
以下正規表示式能夠匹配算術表示式((1+2)*(3+4))。
/([^()]*(((?
/()[^()]*)+((?/))[^()]*)+)*(?(bracket)(?!))/) (80)
下面是對該正規表示式(80)進行詳細分析。
/( # 匹配最外層的左括號;
[^()]* # 匹配最外層左括號後面的、不是括號「()」的內容;((
(?/() # 如果匹配到左括號,則命名為bracket,並壓入堆疊;
[^()]* # 匹配當前左括號後面的、不是括號「()」的內容;)+(
(?/() # 如果匹配到右括號,則彈出命名為bracket的內容;
[^()]* # 匹配右括號後面不是括號的內容
)+)*
(?(bracket)(?!)) #如果匹配到最外層的右括號前面,則檢查堆疊內容是否為空。如果不為空,則匹配失敗。
/) #匹配最外層的右括號
使用工具regex tester測試正規表示式(80),結果如圖所示。
平衡組 遞迴匹配
有時我們需要匹配像 100 50 15 這樣的可巢狀的層次性結構,這時簡單地使用 則只會匹配到最左邊的左括號和最右邊的右括號之間的內容 這裡我們討論的是貪婪模式,懶惰模式也有下面的問題 假如原來的字串裡的左括號和右括號出現的次數不相等,比如 5 3 2 那我們的匹配結果裡兩者的個數也不會相等。有沒有...
PHP正則之遞迴匹配
正則是否能處理括號配對的正則匹配.比如,對於如下的待匹配的字串 就是乙個括號配對的字串.而對於如下的待匹配字串 則不是乙個括號配對的字串.在以前,這種情況,正則無法處理,最多只能處理固定層數的遞迴,而無法處理無線遞迴的情況 而在perl 5.6以後,引入了乙個新的特性 recursive patte...
php zhegnze PHP正則之遞迴匹配
我記得早前有同事問,正則是否能處理括號配對的正則匹配.比如,對於如下的待匹配的字串 就是乙個括號配對的字串.而對於如下的待匹配字串 則不是乙個括號配對的字串.在以前,這種情況,正則無法處理,最多只能處理固定層數的遞迴,而無法處理無線遞迴的情況.而在perl 5.6以後,引入了乙個新的特性 recur...