正則表達式測試工具
即時測試和除錯正則表達式,高亮匹配結果並生成程式碼
什麼是正則表達式?
正則工具用於編寫、測試和理解正則表達式。正則表達式透過模式描述文字,可用於搜尋、提取、校驗和替換,例如類似信箱的字串、日誌欄位、URL、ID、日期或重複格式。測試工具能在模式進入程式碼、資料處理流程或表單校驗前,把匹配結果、捕獲群組、標誌和邊界情況直觀展示出來。正則很強大,但也容易被過度依賴:模式可能匹配過多或過少,在大輸入上變慢,或沒有正確處理 Unicode 和在地化規則。複雜解析、HTML 結構或安全關鍵校驗通常更適合專門的解析器或函式庫。
使用方法
使用方式
- 在左側輸入框輸入您的正規表示式模式
- 選擇需要的旗標(例如 g 為全域比對、i 為不分大小寫)
- 在右側輸入測試文字
- 檢視高亮的比對結果與詳細資訊
正規表示式提示
- 同時用符合和不符合的範例測試模式,這樣更容易發現過於寬泛的表達式。
- 在長文字上小心使用巢狀量詞;某些模式可能因為過度回溯而變得很慢。
使用場景
技術原理
測試器由語言規範中定義的 ECMAScript RegExp 引擎驅動。ECMAScript 正則表達式是一種回溯型 NFA 實現:引擎按照從左到右的順序逐一嘗試每個備選方案,當量詞失敗時回溯,這使得環視和反向引用成為可能,但同時也會在對抗性輸入上產生災難性回溯。引擎支援六個標誌:g(全域匹配)、i(忽略大小寫)、m(多行模式,每行有獨立的 ^ 和 $ 錨點)、s(dotAll,'.' 可匹配換行符)、u(Unicode 模式)和 y(sticky,錨定到 lastIndex)。 不同標誌下的匹配語義差異很大。在 /u 模式下,引擎將模式視為 Unicode 碼點序列而非 UTF-16 碼元,因此代理對會被當作單個字元匹配,同時可以使用 Unicode 屬性類別如 \p{L}(任意字母)、\p{Sc}(貨幣符號)和 \p{Script=Han}。命名捕獲群組 (?<name>...) 和後行斷言 (?<=...) 是 ES2018 的一部分,在 Chromium 64+、Firefox 78+ 和 Safari 16.4+ 中可用,但 PCRE 獨有的功能如原子群 (?>...) 和佔有量詞 (a++) 尚未納入規範。 最大的生產環境風險是 ReDoS(正則表達式拒絕服務)——像 (a+)+b 這樣的模式在輸入 'aaaaaaaaaaaaaaaa!' 上會探索指數級數量的路徑,因為兩個巢狀量詞可以以多種方式分割同一段字元序列。緩解措施眾所周知:避免在同一字元類別上使用巢狀量詞、盡可能使用 ^ 和 $ 錨定、在引擎支援時優先使用原子群,或切換到線性時間引擎如 Go 的 RE2(以犧牲反向引用和後行斷言為代價,保證 O(n) 匹配)。對於需要在服務端驗證的不可信輸入,使用 RE2 或手寫解析器幾乎總是更安全的選擇。
- 引擎:ECMAScript RegExp 是回溯型 NFA,而非 DFA;這使得環視和反向引用成為可能,但也導致了災難性回溯。
- 標誌:g(全域匹配)、i(忽略大小寫)、m(每行 ^/$)、s(dotAll,'.' 可匹配 \n)、u(Unicode 模式,支援代理對)、y(sticky,錨定到 lastIndex)。
- Unicode 模式:/u 解鎖碼點匹配並支援 \p{L}(字母)、\p{Sc}(貨幣)、\p{Script=Han};不使用 /u 時,[a-zA-Z]+ 會遺漏所有非拉丁文字。
- 現代語法可用性:命名捕獲 (?<n>...) 和後行斷言 (?<=...) 在 Chromium 64+、Firefox 78+、Safari 16.4+ 中可用;原子群 (?>...) 和佔有量詞 (a++) 不屬於 ECMAScript 規範。
- ReDoS:在同一字元類別上巢狀量詞如 (a+)+b 會呈指數級爆炸;透過錨定、原子群收緊,或遷移到 RE2 / re2-wasm 處理不可信輸入。
- 複雜度底線:固定字母表上的字面量錨定模式以 O(n) 運行;反向引用和無界環視將最壞情況推向指數級,因此在上線前需對對抗性輸入進行基準測試。
範例
比對電子郵件地址
模式: ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
旗標: gi
輸入: contact: alice@example.com, bob_2024@mail.co.uk, invalid@.com
符合: alice@example.com, bob_2024@mail.co.uk (2 筆)從紀錄中擷取 IPv4 位址
模式: \b(?:\d{1,3}\.){3}\d{1,3}\b
旗標: g
輸入: 2026-06-15 ERROR client 192.168.1.42 connect failed (peer 10.0.0.1)
符合: 192.168.1.42, 10.0.0.1用具名群組擷取日期欄位
模式: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
旗標: g
輸入: Sprint window: 2026-09-01 to 2026-09-15
群組: {year:'2026', month:'09', day:'01'}, {year:'2026', month:'09', day:'15'}貪婪 vs 惰性量詞
輸入: <b>hello</b> <i>world</i>
.* (貪婪) -> 比對整行:<b>hello</b> <i>world</i>
.*? (惰性) -> 僅取首個結果:<b>hello</b>
抓取標籤之間的內容時,通常會想用惰性比對。支援 Unicode 的字母類別
模式: \p{L}+
旗標: gu
輸入: Hello, 北京! Café Москва
符合: Hello, 北京, Café, Россия
若沒有 u 旗標與 \p{L},[a-zA-Z]+ 會漏掉所有非拉丁文字。常見問題
這個測試器使用哪一種正規表達式語法?
JavaScript 的 regex 引擎(ECMAScript)。常見功能與 PCRE 類似,但邊界情況不同:沒有占有量詞(possessive quantifier)、沒有遞迴、後行斷言(lookbehind)需要較新的瀏覽器、命名群組要寫成 (?<name>...)。Python(re/regex)、Java、.NET、PCRE 對同一個表達式的行為可能不同,請務必在實際環境中再測一次。
支援哪些旗標(flag)?
g(全域比對)、i(不區分大小寫)、m(多行模式,^ 與 $ 比對行邊界)、s(dotall,. 也比對換行)、u(Unicode)、y(sticky)、d(hasIndices)。你可以從切換列勾選;頁面會顯示每個旗標如何影響測試文字。
為什麼比對結果比預期少?
沒加 g 旗標時,regex.exec 只會回傳一個比對結果。沒加 m 時,^ 與 $ 只會比對整段輸入的開頭與結尾。沒加 u 時,表情符號這類代理對字元會被當成兩半。多數「為什麼不會動」的狀況都是少加旗標。
怎麼比對表情符號和中日韓文字?
加上 u 旗標啟用正確的 Unicode 處理。使用 \p{...} 字元類別(\p{Letter}、\p{Script=Han}、\p{Emoji})依 Unicode 屬性比對。沒有 u 時,[a-zA-Z] 比對不到帶重音的字元,必須擴成 [a-zA-ZÀ-ÿ] 或改用 \p{L}。
可以從表達式產生程式碼嗎?
多數版本可以將表達式匯出成 JavaScript、Python、PHP、Ruby、Go 或 Java 語法,並做好對應的跳脫處理。但要注意:同一個表達式在不同引擎上的行為可能不同(貪婪預設、字元類別行為、環視支援程度)。一定要在目標語言實機測試。
貪婪量詞和懶惰量詞差在哪裡?
貪婪(* + ?)會盡量比對最多,必要時再回溯;懶惰(*? +? ??)會盡量比對最少。例如「擷取 A 與 B 之間的所有內容」時,若文字中有多個 B,貪婪的 .* 會超出範圍;懶惰的 .*? 會在第一個 B 就停下。需要擷取內部內容時,預設用懶惰較安全。
我的表達式或測試文字會被上傳嗎?
不會。比對直接使用瀏覽器內建的 JavaScript regex 引擎執行,表達式與輸入內容都不會傳出去。