ToolAct工具行動

正則表達式測試工具

即時測試和除錯正則表達式,高亮匹配結果並生成程式碼

正則表達式
//g
修飾符
gglobal
iignore case
mmultiline
sdotAll
uunicode
常用範例
測試文字
匹配結果0 個匹配
無匹配結果

什麼是正則表達式?

正則工具用於編寫、測試和理解正則表達式。正則表達式透過模式描述文字,可用於搜尋、提取、校驗和替換,例如類似信箱的字串、日誌欄位、URL、ID、日期或重複格式。測試工具能在模式進入程式碼、資料處理流程或表單校驗前,把匹配結果、捕獲群組、標誌和邊界情況直觀展示出來。正則很強大,但也容易被過度依賴:模式可能匹配過多或過少,在大輸入上變慢,或沒有正確處理 Unicode 和在地化規則。複雜解析、HTML 結構或安全關鍵校驗通常更適合專門的解析器或函式庫。

使用方法

使用方式

  1. 在左側輸入框輸入您的正規表示式模式
  2. 選擇需要的旗標(例如 g 為全域比對、i 為不分大小寫)
  3. 在右側輸入測試文字
  4. 檢視高亮的比對結果與詳細資訊

正規表示式提示

  • 同時用符合和不符合的範例測試模式,這樣更容易發現過於寬泛的表達式。
  • 在長文字上小心使用巢狀量詞;某些模式可能因為過度回溯而變得很慢。

使用場景

即時測試 JavaScript 正則表達式輸入模式,選擇 g、i、m、s、u 等標誌,在範例文字上測試並高亮顯示匹配結果。無效的正則語法會立即被捕獲,零長度的全域匹配也能正確處理而不會鎖死迴圈。即時回饋讓反覆調整比在控制台執行腳本或每次修改模式後重啟編輯器更快。
檢查匹配位置和命名群組每個匹配會列出其文字、起始和結束偏移量,以及命名捕獲群組(如果有的話)。這在為日誌、表單驗證、匯入規則或資料清理腳本調整提取模式時很有用。可見的偏移量讓同一個模式可以直接用於已在追蹤原始檔案中字元位置的更大工作流程中。
將可用的模式轉為程式碼片段套用內建的 Email、URL、IP、日期、顏色、中文文字、數字和空白字元範例,然後使用選取的標誌為 JavaScript、Python、Java、PHP 或 Go 產生可複製的片段(每種語言支援的標誌不同)。產生的片段包含字面量模式和匹配標誌集,因此執行時的行為與頁面中測試的一致。
偵測災難性回溯和失控匹配將較長或對抗性的字串貼入測試器,暴露如 (a+)+ 或 .*foo.* 等會凍結引擎的巢狀量詞。觀察匹配計數和每個匹配的偏移量;如果迭代停滯或記憶體飆升,使用原子群、佔有量詞或收緊錨點來簡化。好的模式能在最壞情況的輸入下存活而不會出現指數級爆炸。
比較貪婪與懶惰量詞、後行斷言和 \p{L}使用測試器觀察貪婪量詞 (.*) 和懶惰量詞 (.*?) 如何在同一段文字中選取不同的前綴,然後檢查後行斷言支援 (?<=),它在 JavaScript 和 PCRE 中可用但不是每個舊引擎都支援。開啟 u 標誌以使用 Unicode 屬性類別如 \p{L}(任意字母)和 \p{Sc}(貨幣符號),讓基於字母的模式在拉丁文、西里爾文和漢字中保持正確。

技術原理

測試器由語言規範中定義的 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 引擎執行,表達式與輸入內容都不會傳出去。