描述文字模式的語言。Regex = Regular Expression。最基本模式為純文字,如 cat 匹配 "About cats"。
測試:regex|regex not 匹配 "regex not" → 若匹配 "regex" 為 NFA;匹配 "regex not" 為 DFA。
11 個中繼字元:[ ] \ ^ $ . | ? * + ( )。需匹配字面值時以反斜槓逸出。程式語言中雙重逸出(如 C++ \\\\ 匹配單一反斜槓)。
[ae] 匹配 a 或 e。[0-9a-fA-F] 十六進位字元。[^...]:[^u] 匹配非 u 字元(含換行)。注意:q[^u] 需匹配 q 後接一非 u 字元,不匹配字串結尾的 q。\d=[0-9]、\w=[A-Za-z0-9_]、\s 空白字元。大寫為反義:\D、\W、\S。? 0 或 1、* 0 或多、+ 1 或多、{3,5} 3~5 次。<.+> 匹配 "first" 整串而非單一標籤。?(+?、*?、{3,5}?),盡可能少匹配。<.+?> 正確匹配 ""。<[^>]+> 無回溯、效能最佳。^ 行首、$ 行尾。多行模式下匹配每行首尾。\A 字串絕對開頭、\Z 字串絕對結尾(忽略多行模式)。\b 單字邊界(\w 與 \W 交界)、\B 非單字邊界。優先序最低。Get|GetValue|Set|SetValue 匹配 "SetValue" 會回傳 "Set"(NFA 急切回傳)。解法:調整順序置長者優先、使用選擇群組 (Get|GetValue)、或加入單字邊界 \b(Get|Set)(Value)?\b。
(...) 建立捕獲群組,編號自 1 起。\1 引用第一群組匹配內容。<([A-Z][A-Z0-9]*)[^>]*>.*?</\1>、偵測重複單字 \b(\w+)\s+\1\b。(?:...) 不佔用編號、提升效能。(?=...)、否定前瞻 (?!...):不消耗字元,僅斷言其後內容是否匹配。例:q(?!u) 匹配非 u 後續的 q(含字串結尾)。(?<=...)、否定後瞻 (?<!...):斷言前方內容。注意:後瞻需固定寬度(大多引擎限制)。\b(?=\w{6}\b)\w*cat\w*。(?(?=regex)then|else):依前瞻結果決定匹配分支。前瞻不消耗字元,分支從相同位置嘗試。
(?#comment) 內嵌註解。(?i) 忽略大小寫、(?s) 單行模式(.匹配換行)、(?m) 多行模式(^$匹配行首尾)。區段控制:(?i)te(?-i)st 僅 "te" 不分大小寫。(?>...):內部匹配失敗時直接回溯至群組之前,防止災難性回溯。例:^(?>(.*?,){11})P 失敗時僅回溯 1 次而非指數級。
NFA 引擎採「左most longest(貪婪)」或「左most shortest(惰性)」策略,逐字元嘗試、回溯。理解回溯機制是撰寫高效能正則的關鍵。