正規表示式之平衡組 遞迴匹配 巢狀匹配

2021-05-24 03:07:14 字數 1035 閱讀 7756

以下轉個我認為很有用的東西

有時我們需要匹配像( 100 * ( 50 + 15 ) )這樣的可巢狀的層次性結構

,這時簡單地使用/(.+/)

則只會匹配到最左邊的左括號和最右邊的右括號之間的內容(這裡我們討論的是貪婪模式,懶惰模式也有下面的問題)。假如原來的字串裡的左括號和右括號出現的次數不相等,比如( 5 / ( 3 + 2 ) ) )

,那我們的匹配結果裡兩者的個數也不會相等。有沒有辦法在這樣的字串裡匹配到最長的,配對的括號之間的內容呢?

為了避免(

和/(把你的大腦徹底搞糊塗,我們還是用尖括號代替圓括號吧。現在我們的問題變成了如何把xx aa> yy

這樣的字串裡,最長的配對的尖括號內的內容捕獲出來?

這裡需要用到以下的語法構造:

我們需要做的是每碰到了左括號,就在壓入乙個"open",每碰到乙個右括號,就彈出乙個,到了最後就看看堆疊是否為空--如果不為空那就證明左括號比右括號多,那匹配就應該失敗。正規表示式引擎會進行回溯(放棄最前面或最後面的一些字元),盡量使整個表示式得到匹配。

<                         #最外層的左括號

[^<>]* #最外層的左括號後面的不是括號的內容((

(?'open'<) #碰到了左括號,在黑板上寫乙個"open"

[^<>]* #匹配左括號後面的不是括號的內容)+(

(?'-open'>) #碰到了右括號,擦掉乙個"open"

[^<>]* #匹配右括號後面不是括號的內容

)+)*

(?(open)(?!)) #在遇到最外層的右括號前面,判斷黑板上還有沒有沒擦掉的"open";如果還有,則匹配失敗

> #最外層的右括號

平衡組的乙個最常見的應用就是匹配html,下面這個例子可以匹配巢狀的標籤

:]*>[^<>]*(((?'open']*>)[^<>]*)+((?'-open'

)[^<>]*)+)*(?(open)(?!)).

正規表示式匹配 遞迴

請實現乙個函式用來匹配包含 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但與 aa.a 和 ab a 均不匹配。示例 1 輸入 s aa p ...

33 正規表示式匹配(遞迴)

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 輸入 s ...

正規表示式 詳細講解平衡組

要讀懂這篇文章的精髓,你最好要有一點正則匹配原理的基礎。比如 匹配文字內容 asp163 稍懂正規表示式的人都知道可以匹配,但是你知道他的匹配過程嗎?如果你不太清楚,那麼下面的內容,對你來說可能不太適合,或許,看的太吃力且無法領悟平衡組的用法。因此,我建議你先了解正規表示式nfa引擎的匹配原理。想要...