第八章 匹配原理

8.1 有窮自動機

正則表達式能迅速進行復雜處理的祕密就在於,它採用了一種特殊的理論模型:有窮自動機(finite automata),也叫做有窮狀態自動機(finite-state machine)。這種機器具備有限個狀態,可以根據不同條件在狀態之間轉移。
嚴格的說起來,有窮自動機必須滿足4個條件:

  1. 具有有限多個狀態
  2. 有一套狀態轉移函數(規則)
  3. 有一個開始狀態
  4. 有一個或多個最終狀態

8.2 正則表達式的匹配過程

正則表達式所使用的理論模型就是有窮自動機,其具體實現稱爲正則引擎(regex engine)。用正則表達式處理字符串,首先需要生成自動機(“編譯”正則對象);之後無論輸入什麼字符串,正則引擎都只需要老老實實地在狀態之間遊走。

8.3 回溯

比起DFA,NFA看起來足夠“麻煩”:它的狀態是不確定的,這有點像走迷宮,越走岔路口越多,最後不會迷路嗎?

不過,NFA的正則引擎自有辦法:如果有多個可能的狀態,它們會在選擇時記錄下這些狀態備用,然後才選擇其中某個狀態嘗試;如果之後遇到死路,則退回去,選擇最近一次記錄的且未嘗試過的狀態;如果又遇到死路,再選擇最近一次記錄的且未嘗試過的狀態...

這有點像在分岔路口留下標記——如果我們在遇到的每個分岔路口都留下標記,即使前頭是死路,也可以根據標記返回,而不會迷路。

8.4 NFA和DFA

根據狀態的確定與否,一般我們會把有窮自動機(正則引擎)分爲兩類:一類是確定型有窮自動機(definite finite automata,簡稱DFA),在任何時刻,它所處的狀態是確定無疑的;另一臺是非確定型有窮自動機(non-definite finite automata,簡稱NFA),在某個時刻,它所處的狀態可能是不確定的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章