正規表示式入門
對於許多程式設計師來說,正規表示式是他們用來解決任何型別的文字解析情況的某種神奇劍。但是這個工具並不神奇,即使它的功能很棒,它也不是一個全功能的程式語言( 即它不是圖靈完備的)。
正則表達是什麼意思?
正規表示式表達由常規語法定義的語言,該語法可以通過非確定性有限自動機 (NFA) 來解決,其中匹配由狀態表示。
一個正規文法是由表達最簡單的文法喬姆斯基層次 。
簡單地說,常規語言通過 NFA 可以表達的內容直觀地表達,這是 NFA 的一個非常簡單的例子:
而正規表示式語言就是這樣一個自動的文字表示。最後一個例子由以下正規表示式表示:
^[01]*1$
哪個匹配任何以 0
或 1
開頭的字串,重複 0 次或更多次,以 1
結尾。換句話說,它是一個正規表示式,用於匹配二進位制表示中的奇數。
所有正規表示式實際上都是常規語法嗎?
實際上他們不是。許多正規表示式引擎已得到改進,並且正在使用下推式自動機 ,它可以堆疊,並在執行時彈出資訊。那些自動機在喬姆斯基的層次結構中定義了所謂的無上下文語法 。非常規正規表示式中最典型的用法是使用遞迴模式進行括號匹配。
像下面這樣的遞迴正規表示式(匹配括號)是這樣一個實現的一個例子:
{((?>[^\(\)]+|(?R))*)}
(這個例子不適用於 python 的 re
引擎,但是使用了 regex
引擎 ,或者使用了 PCRE 引擎 )。
資源
有關正規表示式背後理論的更多資訊,你可以參考麻省理工學院提供的以下課程:
當你編寫或除錯複雜的正規表示式時,有一些線上工具可以幫助將正規表示式視覺化為自動機,例如 debuggex 站點 。