2 14 遞迴匹配

2021-04-16 00:41:52 字數 1373 閱讀 3818

遞迴匹配在匹配具有巢狀結構的字串時特別有效。給定算術表示式((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...