正規表示式入門

對於許多程式設計師來說,正規表示式是他們用來解決任何型別的文字解析情況的某種神奇劍。但是這個工具並不神奇,即使它的功能很棒,它也不是一個全功能的程式語言( 不是圖靈完備的)。

正則表達是什麼意思?

正規表示式表達由常規語法定義的語言,該語法可以通過非確定性有限自動機 (NFA) 來解決,其中匹配由狀態表示。

一個正規文法是由表達最簡單的文法喬姆斯基層次

喬姆斯基的等級制度

簡單地說,常規語言通過 NFA 可以表達的內容直觀地表達,這是 NFA 的一個非常簡單的例子:

NFA 示例

正規表示式語言就是這樣一個自動的文字表示。最後一個例子由以下正規表示式表示:

^[01]*1$

哪個匹配任何以 01 開頭的字串,重複 0 次或更多次,以 1 結尾。換句話說,它是一個正規表示式,用於匹配二進位制表示中的奇數。

所有正規表示式實際上都是常規語法嗎?

實際上他們不是。許多正規表示式引擎已得到改進,並且正在使用下推式自動機 ,它可以堆疊,並在執行時彈出資訊。那些自動機在喬姆斯基的層次結構中定義了所謂的無上下文語法 。非常規正規表示式中最典型的用法是使用遞迴模式進行括號匹配。

像下面這樣的遞迴正規表示式(匹配括號)是這樣一個實現的一個例子:

{((?>[^\(\)]+|(?R))*)}

(這個例子不適用於 python 的 re 引擎,但是使用了 regex 引擎 ,或者使用了 PCRE 引擎 )。

資源

有關正規表示式背後理論的更多資訊,你可以參考麻省理工學院提供的以下課程:

當你編寫或除錯複雜的正規表示式時,有一些線上工具可以幫助將正規表示式視覺化為自動機,例如 debuggex 站點