本網站的其他內容 |
簡介 |
正規表示式快速開始 |
正規表示式教學 |
替換字串教學 |
應用程式和語言 |
正規表示式範例 |
正規表示式參考 |
替換字串參考 |
書評 |
可列印 PDF |
關於本網站 |
RSS 饋送和部落格 |
我已經說明如何使用 字元類別 從幾個可能的字元中比對單一字元。交替類似。您可以使用交替從幾個可能的正規表示式中比對單一正規表示式。
如果您要搜尋文字 cat 或 dog,請使用垂直線或管線符號分隔兩個選項:cat|dog。如果您要更多選項,只需擴充清單:cat|dog|mouse|fish。
交替運算子在所有 regex 運算子中具有最低優先順序。也就是說,它會指示 regex 引擎比對直線符號左邊的所有內容,或直線符號右邊的所有內容。如果你想要限制交替的範圍,你需要使用括號來進行分組。如果我們想要改善第一個範例,只比對完整的字詞,我們需要使用 \b(cat|dog)\b。這會指示 regex 引擎尋找 字詞邊界,然後尋找 cat 或 dog,最後再尋找另一個字詞邊界。如果我們省略括號,regex 引擎就會尋找字詞邊界,然後尋找 cat,或尋找 dog,然後尋找字詞邊界。
我已經說明 regex 引擎很急切。它會在找到有效比對後立即停止搜尋。因此,在某些情況下,替代方案的順序很重要。假設你想要使用 regex 比對程式語言中的函式名稱清單:Get、GetValue、Set 或 SetValue。顯而易見的解法是 Get|GetValue|Set|SetValue。當字串為 SetValue 時,讓我們看看它是如何運作的。
regex 引擎會從 regex 中的第一個標記 G,以及字串中的第一個字元 S 開始。比對失敗。不過,regex 引擎在開始之前已經研究過整個正規表示式。因此,它知道這個正規表示式使用交替,而且整個 regex 尚未失敗。所以它會繼續執行第二個選項,也就是 regex 中的第二個 G。比對再次失敗。下一個標記是 regex 中的第一個 S。比對成功,而且引擎會繼續執行字串中的下一個字元,以及 regex 中的下一個標記。regex 中的下一個標記是剛才成功比對的 S 之後的 e。 e 比對 e。下一個標記 t 比對 t。
在這個時候,交替中的第三個選項已經成功比對。由於 regex 引擎很急切,它會在其中一個選項成功比對後,就認為整個交替已經成功比對。在此範例中,regex 中沒有其他標記在交替之外,所以整個 regex 已經成功比對 SetValue 中的 Set。
與我們的本意相反,正規表示式並未比對整個字串。有幾個解決方案。一個選項是考慮正規表示式引擎的急切性,並變更選項的順序。如果我們使用 GetValue|Get|SetValue|Set,SetValue 會在 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 時,它會嘗試在字串開頭執行正規表示式的所有排列組合。它會有效率地執行,而不會進行任何回溯。它會看到正規表示式可以在字串開頭找到比對,而且比對的文字可以是 Set 或 SetValue。由於文字導向引擎將正規表示式視為一個整體來評估,因此它沒有概念一個選項列在另一個選項之前。但它必須選擇要傳回哪個比對。它總是傳回最長的比對,在本例中為 SetValue。
POSIX 標準 由實作選擇文字導向或正規表示式導向引擎。包含反向參照的 BRE 需要使用正規表示式導向引擎評估。但沒有反向參照的 BRE 或 ERE 可以使用文字導向引擎評估。但 POSIX 標準確實要求傳回最長匹配,即使使用正規表示式導向引擎也是如此。此類引擎不能急於求成。它必須在找到匹配後繼續嘗試所有替代方案,以找到最長的匹配。當正規表示式包含多個量詞或量詞與交替的組合時,這可能會導致效能非常差,因為必須嘗試所有組合才能找到最長匹配。
| 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |
| 簡介 | 目錄 | 特殊字元 | 非可列印字元 | 正規表示式引擎內部 | 字元類別 | 字元類別減法 | 字元類別交集 | 簡寫字元類別 | 點 | 錨點 | 字元邊界 | 交替 | 選項項目 | 重複 | 群組和擷取 | 反向參照 | 反向參照,第 2 部分 | 命名群組 | 相對反向參照 | 分支重設群組 | 自由間距和註解 | Unicode | 模式修改器 | 原子群組 | 佔有量詞 | 展望和回顧 | 展望和回顧,第 2 部分 | 將文字保留在匹配之外 | 條件 | 平衡群組 | 遞迴 | 子常式 | 無限遞迴 | 遞迴和量詞 | 遞迴和擷取 | 遞迴和反向參照 | 遞迴和回溯 | POSIX 方括號表示式 | 零長度匹配 | 繼續匹配 |
頁面網址:https://regular-expressions.dev.org.tw/alternation.html
頁面最後更新時間:2019 年 11 月 22 日
網站最後更新時間:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。