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

使用垂直線或管線符號進行交替

我已經說明如何使用 字元類別 從幾個可能的字元中比對單一字元。交替類似。您可以使用交替從幾個可能的正規表示式中比對單一正規表示式。

如果您要搜尋文字 catdog,請使用垂直線或管線符號分隔兩個選項:cat|dog。如果您要更多選項,只需擴充清單:cat|dog|mouse|fish

交替運算子在所有 regex 運算子中具有最低優先順序。也就是說,它會指示 regex 引擎比對直線符號左邊的所有內容,或直線符號右邊的所有內容。如果你想要限制交替的範圍,你需要使用括號來進行分組。如果我們想要改善第一個範例,只比對完整的字詞,我們需要使用 \b(cat|dog)\b。這會指示 regex 引擎尋找 字詞邊界,然後尋找 catdog,最後再尋找另一個字詞邊界。如果我們省略括號,regex 引擎就會尋找字詞邊界,然後尋找 cat,或尋找 dog,然後尋找字詞邊界。

請記住 regex 引擎很急切

我已經說明 regex 引擎很急切。它會在找到有效比對後立即停止搜尋。因此,在某些情況下,替代方案的順序很重要。假設你想要使用 regex 比對程式語言中的函式名稱清單:Get、GetValue、Set 或 SetValue。顯而易見的解法是 Get|GetValue|Set|SetValue。當字串為 SetValue 時,讓我們看看它是如何運作的。

regex 引擎會從 regex 中的第一個標記 G,以及字串中的第一個字元 S 開始。比對失敗。不過,regex 引擎在開始之前已經研究過整個正規表示式。因此,它知道這個正規表示式使用交替,而且整個 regex 尚未失敗。所以它會繼續執行第二個選項,也就是 regex 中的第二個 G。比對再次失敗。下一個標記是 regex 中的第一個 S。比對成功,而且引擎會繼續執行字串中的下一個字元,以及 regex 中的下一個標記。regex 中的下一個標記是剛才成功比對的 S 之後的 ee 比對 e。下一個標記 t 比對 t

在這個時候,交替中的第三個選項已經成功比對。由於 regex 引擎很急切,它會在其中一個選項成功比對後,就認為整個交替已經成功比對。在此範例中,regex 中沒有其他標記在交替之外,所以整個 regex 已經成功比對 SetValue 中的 Set

與我們的本意相反,正規表示式並未比對整個字串。有幾個解決方案。一個選項是考慮正規表示式引擎的急切性,並變更選項的順序。如果我們使用 GetValue|Get|SetValue|SetSetValue 會在 Set 之前嘗試,而引擎會比對整個字串。我們也可以將四個選項合併為兩個,並使用 問號 使其中一部分為選用:Get(Value)?|Set(Value)?。由於問號是貪婪的,因此 SetValue 會在 Set 之前嘗試。

最佳選項可能是表達我們只想要比對完整的單字。如果字串為 SetValueFunction,我們不想要比對 Set 或 SetValue。因此,解決方案是 \b(Get|GetValue|Set|SetValue)\b\b(Get(Value)?|Set(Value)?)\b。由於所有選項的結尾都相同,我們可以進一步最佳化為 \b(Get|Set)(Value)?\b

文字導向引擎傳回最長的比對

交替是 正規表示式導向和文字導向引擎不同的部分。當文字導向引擎嘗試在 SetValue 上執行 Get|GetValue|Set|SetValue 時,它會嘗試在字串開頭執行正規表示式的所有排列組合。它會有效率地執行,而不會進行任何回溯。它會看到正規表示式可以在字串開頭找到比對,而且比對的文字可以是 SetSetValue。由於文字導向引擎將正規表示式視為一個整體來評估,因此它沒有概念一個選項列在另一個選項之前。但它必須選擇要傳回哪個比對。它總是傳回最長的比對,在本例中為 SetValue

POSIX 要求最長匹配

POSIX 標準 由實作選擇文字導向或正規表示式導向引擎。包含反向參照的 BRE 需要使用正規表示式導向引擎評估。但沒有反向參照的 BRE 或 ERE 可以使用文字導向引擎評估。但 POSIX 標準確實要求傳回最長匹配,即使使用正規表示式導向引擎也是如此。此類引擎不能急於求成。它必須在找到匹配後繼續嘗試所有替代方案,以找到最長的匹配。當正規表示式包含多個量詞或量詞與交替的組合時,這可能會導致效能非常差,因為必須嘗試所有組合才能找到最長匹配。

TclGNU 風格也以這種方式運作。