正規表示式測試
正規表示式測試
支援正規表示式的即時比對測試,提供旗標控制、擷取群組解析、命名群組及即時替換預覽。支援效能風險偵測與逾時保護,適用於模式驗證、文字擷取及批次替換。
快速開始
常見使用情境
從日誌和文字中提取 ID、電子郵件、日期或自訂標記。
在整合到程式碼之前驗證使用者輸入格式。
使用擷取組和命名組批次取代內容。
使用建議
限制與相容性
隱私與安全
常見問題
正規表示式(Regular Expression,簡稱 regex)是一種用特定語法描述文字模式的工具。你可以把它理解為「進階搜尋」——不是搜尋一個固定詞,而是搜尋符合某種規則的所有文字。\n\n例如 \\d{4}-\\d{2}-\\d{2} 可以比對所有「年-月-日」格式的日期,[\\w.]+@[\\w.]+ 可以比對電子郵件地址。正規表示式廣泛用於:文字搜尋與擷取、格式驗證、批次替換。\n\n幾乎所有程式語言(JavaScript、Python、Java、Go 等)和大量工具(VS Code、grep、sed)都支援正規表示式。本工具使用 JavaScript 的 RegExp 引擎,適合線上快速驗證和學習。
JavaScript 正規表示式預設只回傳第一個比對項,這是語言規範行為而非工具限制。點擊旗標列中的 g 即可開啟全域搜尋。\n\n需注意 g 和 y 的互動:g 從頭到尾掃描整段文字,而 y(定點比對)要求每次比對必須緊接上次比對的結尾——如果比對項之間有間隔字元,y 會在遇到第一個間隔時停止。通常只開 g 不開 y 就夠用了。
常見原因有四類:\n\n1. 括號未配對:每個 ( 必須有對應的 ),每個 [ 必須有對應的 ]。\n2. 量詞位置錯誤:量詞(*、+、?、{n})必須跟在可量化的元素後面。*+ 或 ?* 這類連寫是非法的,除非前一個量詞是 ? 用於惰性修飾(如 *?)。\n3. 跳脫不完整:單獨的 \\ 在末尾是非法的,必須跳脫一個具體字元(如 \\d、\\n、\\\\)。\n4. Unicode 屬性需要 u 旗標:\\p{L}、\\p{Script=Han} 等 Unicode 屬性跳脫在未開啟 u 旗標時會報錯。
這些是 JavaScript String.prototype.replace() 定義的替換引用語法:\n\n- $1、$2、...、$99:引用正規表示式中第 n 個擷取群組的比對內容\n- $&:整個比對的完整文字\n- $`:比對位置之前的文字\n- $':比對位置之後的文字\n- ${name}:引用命名群組的比對內容\n\n例如用模式 (\\w+)\\s(\\w+) 比對「hello world」,替換為 $2-$1 得到「world-hello」。如需字面的 $ 符號,寫 $$ 即可。
逾時幾乎都是「災難性回溯」造成的。當正規引擎遇到巢狀量詞(如 (a+)+b)時,會回溯嘗試指數級數量的排列組合。\n\n典型危險模式:(a+)+、(.*?)*、(.+)+$ 等。解決方法:\n1. 用精確的字元類別替代 .,例如 [^\\s]+ 替代 .+\n2. 避免巢狀量詞,將 (a+)+ 改為 a+\n3. 減少重疊的可選路徑\n\n調整模式後點擊「重試」按鈕重新測試。工具設有 4 秒逾時保護。
不同語言的正規引擎存在差異,主要體現在三方面:\n\n1. 語法支援範圍不同:JavaScript 不支援 PCRE 的遞迴模式 (?R)、條件分支、原子群組等。\n2. Unicode 處理差異:Python 3 預設按 Unicode 處理 \\w、\\d,JavaScript 預設按 ASCII——需手動開啟 u 旗標。\n3. 換行符語義不同:Python 的 . 預設不比對 \\n,Java 的 Pattern.DOTALL 與 JavaScript 的 s 旗標行為一致。\n\n建議:在本工具快速驗證後,以目標語言的引擎做最終確認。