正則表達式和模式匹配簡介

正則表達式和模式匹配簡介

作者:張桂權

(摘自《

正則表達式袖珍手冊》一書。譯者,張桂權。可以從http://download.csdn.net/source/346896下載完整的譯稿。如果感覺不錯就去買一本原版的書吧,Regular Expression Pocket Reference,支持原書的作者。看PDF文件也是很累的。看完之後別忘了,給我提寶貴意見哦。謝謝。[email protected]

一個正則表達式(regular expression)就是包含正常字符串和特殊元字符(metacharacters)或元序列(metasequences)的字符串。正常字符串匹配它們自己。元字符和元序列是字符或表示數量、位置或字符類型的字符序列。“正則表達式元字符、模式和結構”列表,展示了正則表達式中最通用的元字符和元序列。後面的章節中將列出正則表達式的特殊實現所支持的有效的元字符和它的語法。

 

模式匹配包括搜索由正則表達式匹配的文本一部分。搜索這個文本的核心代碼叫正則表達式引擎(regular expression engine)。只要記住以下兩個規則,你就可以推出絕大多數的正則表達式的結果:

 

1.       最早匹配成功(最左邊的)

正則表達式應用到輸入的時候是從第一個字符,並一次處理到最後一個字符。一旦正則表達式引擎找到一個匹配,就立即返回(請參看MRE 148-149)。

 

2.       標準計量器是貪婪的

計量器指定一個對象(字符、字符串)的最大可重複次數。標準的計量器千方百計想匹配所有可能的次數。如果對於匹配成功有必要那麼可以將其值設置爲比最大值小的數。遺漏字符和試圖少貪婪匹配的處理過程叫回溯(backtracking,請參看MRE 151-153)。

      

       不同類型的正則表達式有各自不相同的特點。通常由兩種類型的引擎:確定有限自動機(Deterministic Finite Automaton, DFA)和非確定有限自動機(Nondeterministic Finite Automaton, NFA)。DFA速度快,但是缺了NFA的許多特性,比如,捕獲、環顧四周、非貪婪計量器。NFA有傳統實現和POSIX兩類。


DFA引擎

       DFAs用輸入字符串的每一個字符依次和正則表達式比較,並記錄這個過程中所有的匹配。由於每一字符最多隻檢測一次,所以DFA引擎的速度最快。DFAs的一個傳統的記憶方法是它的交換是貪婪。當在一次匹配中有不止一個可選(foo|foobar)時,選擇最長的一個。所以規則1可以記作“最長最左匹配成功。”(請參看MRE 155-156


傳統的NFA引擎

       傳統的NFA引擎用正則表達式的每一個元素跟輸入字符串進行比較,並記錄正則表達式中所選擇的兩個選項的位置。如果一個選擇失敗,引擎回溯到最近保存的位置。在標準計量器的作用下,引擎一般採用貪婪的選項來匹配更多的文本。然而,如果這個選項導致匹配的失敗,那麼引擎會返回到一個保存的位置,並嘗試低貪婪度的路徑。傳統的NFA引擎採用順序交換,這樣交換中的每一個選項都依次進行嘗試。如果前面已經找到了一個成功的匹配,那麼很長的匹配可能會被忽略。所以,規則1可以稱作去讀“貪婪量器滿足條件之後的最先最左匹配”。(請參看MRE 153-154

 

POSIX NFA引擎

       OPSIX NFA引擎的原理和傳統的NFA相似,主要的一個差別是:POSIX引擎總是選擇最長最左匹配。比如,交換cat | category,即使第一個交換(“cat”)已經匹配成功,而且在前面出現過,如果可能的話,仍將匹配“category”整個字。(請參看MRE 153-154

 

正則表達式元字符、模式和結構

       這裏所講的元字符和元序列表示正則表達式結構和通用語法的可用類型。然而,不同實現之間的語法和可用性差異很大。

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