快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式教學
簡介
目錄
特殊字元
不可列印字元
正規表示式引擎內部
字元類別
字元類別減法
字元類別交集
簡寫字元類別
錨點
字詞邊界
交替
選用項目
重複
群組和擷取
反向參照
反向參照,第 2 部分
命名群組
相對反向參照
分支重設群組
自由間距和註解
Unicode
模式修改器
原子群組
獨佔量詞
前瞻和後顧
環顧,第 2 部分
將文字保持在比對之外
條件
平衡群組
遞迴
子常式
無限遞迴
遞迴和量詞
遞迴和擷取
遞迴和反向參照
遞迴和回溯
POSIX 方括號表示式
零長度比對
繼續比對
更多本網站內容
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—Better than a regular expression tutorial!

初探正規表示式引擎內部運作方式

了解正規表示式引擎的運作方式,能讓您更輕鬆地撰寫更好的正規表示式。它能幫助您快速了解特定正規表示式為何無法執行您最初預期的動作。當您需要撰寫更複雜的正規表示式時,這能為您省下大量猜測和苦思的時間。

在本教學中,我們會在介紹新的正規表示式符號後,逐步說明正規表示式引擎實際上如何處理該符號。這種深入探討在某些時候可能看起來有點冗長。但了解正規表示式引擎的運作方式,能讓您充分利用其功能,並幫助您避免常見的錯誤。

儘管有許多正規表示式實作在語法和行為上有些微或顯著的差異,但基本上只有兩種正規表示式引擎:文字導向引擎和正規表示式導向引擎。幾乎所有現代正規表示式風格都基於正規表示式導向引擎。這是因為某些非常有用的功能,例如惰性量詞反向參照,只能在正規表示式導向引擎中實作。

由正規表示式導向的引擎會遍歷正規表示式,嘗試將正規表示式中的下一個標記與下一個字元配對。如果找到配對,引擎會在正規表示式和主旨字串中前進。如果標記無法配對,引擎會回溯到正規表示式和主旨字串中的前一個位置,嘗試正規表示式中的不同路徑。本教學課程稍後會詳細說明回溯。使用由正規表示式導向的引擎的現代正規表示式風格有許多功能,例如原子群組佔有量詞,可讓您控制此回溯。

由文字導向的引擎會遍歷主旨字串,嘗試正規表示式的所有排列組合,然後再前進到字串中的下一個字元。由文字導向的引擎絕不會回溯。因此,關於由文字導向的引擎的配對程序沒有太多需要討論的。在大部分情況下,由文字導向的引擎會找到與由正規表示式導向的引擎相同的配對。

當本教學課程討論正規表示式引擎內部時,討論假設為由正規表示式導向的引擎。它只會在由文字導向的引擎找到不同配對時提及由文字導向的引擎。而這只會在您的正規表示式使用交替時發生,其中兩個選項可以在同一個位置配對。

正規表示式引擎總是傳回最左邊的配對

這是非常重要的觀念:正規表示式引擎總是傳回最左邊的配對,即使稍後可能會找到「更好的」配對。將正規表示式套用至字串時,引擎會從字串的第一個字元開始。它會嘗試正規表示式在第一個字元的所有可能排列組合。只有在嘗試所有可能性並發現都失敗時,引擎才會繼續處理文字中的第二個字元。它會再次嘗試正規表示式的所有可能排列組合,順序完全相同。結果是正規表示式引擎會傳回最左邊的配對。

當將 cat 套用於 He captured a catfish for his cat. 時,引擎會嘗試將 regex 中的第一個代幣 c 與 match 中的第一個字元 H 相符。這會失敗。此 regex 沒有其他可能的排列組合,因為它僅由一系列字面字元組成。因此,regex 引擎會嘗試將 ce 相符。這也會失敗,將 c 與空格相符也是如此。到達字串中的第 4 個字元時,cc 相符。然後,引擎會嘗試將第二個代幣 a 與第 5 個字元 a 相符。這也成功了。但是,t 無法與 p 相符。在那個時間點,引擎知道無法從字串中的第 4 個字元開始相符 regex。因此,它繼續第 5 個字元:a。同樣地,c 無法在此相符,而引擎繼續進行。在字串中的第 15 個字元,c 再次與 c 相符。然後,引擎會繼續嘗試在第 15 個字元相符 regex 的其餘部分,並發現 aa 相符,tt 相符。

整個正規表示法可以從第 15 個字元開始相符。引擎「急於」回報相符。因此,它回報 catfish 的前三個字母作為有效相符。引擎從未超過這個點繼續進行,以查看是否有任何「更好的」相符。第一個相符被視為足夠好。

在引擎內部運作的第一個範例中,我們的 regex 引擎看起來就像常規文字搜尋常式一樣運作。然而,重要的是,您可以在腦中遵循引擎執行的步驟。在後續範例中,引擎的運作方式對它找到的相符有深遠的影響。有些結果可能會令人驚訝。但是,一旦您知道引擎的運作方式,它們總是合乎邏輯且預先決定的。