Regex Tester

Regex 測試器

建構與測試正規表達式 — 即時 match 標示、capture group 解析、replace 模式預覽。JavaScript 風格,完全在瀏覽器內運算。

JavaScript / ECMAScript regex(就是瀏覽器原生 RegExp 用的引擎)。它是 POSIX 的嚴格超集,常用功能也與 Python re、Java Pattern、PCRE 大量重疊。差異要注意:JavaScript 支援 lookahead/lookbehind、命名 group(/(?...)/),以及 /u、/y 旗標;但不支援 possessive 量詞(a++、a*+)、原子群組((?>...))、與 branch-reset 群組 — 那些是 PCRE 特有。

不會。整個工具就是這個分頁裡的 JavaScript。Pattern 編譯、matching、replacement 全都用瀏覽器原生 RegExp 在本地執行。打開 DevTools → Network 觀察:輸入時不會發任何請求。可以放心貼上正式日誌、客戶 email、或任何不該被伺服器記錄的內容。

/ /
Match 結果
Pattern 解析
Regex 速查表
. 任一字元(預設不含換行;加 /s 旗標時也包含換行)
\d 任一數字(0-9)
\D 非數字
\w Word 字元(a-z、A-Z、0-9、底線)
\W 非 word 字元
\s 空白字元(空格、tab、換行)
\S 非空白
\b 單字邊界
^ $ 字串開頭 / 結尾(加 /m 旗標時對應行首 / 行尾)
* 前一元素出現 0 次或多次
+ 前一元素出現 1 次或多次
? 前一元素出現 0 或 1 次(可選)
{n,m} 前一元素出現 n 到 m 次
(...) Capture group — 結果存到 $1、$2…
(?:...) 非捕獲群組 — 用於分組但不捕獲
(?<n>...) 命名 capture group — 替換時用 $<n> 引用
[abc] 字元類別 — 任一個 a、b 或 c
[^abc] 否定字元類別 — 任一個非 a、b、c 的字元
a|b 或關係 — 匹配 a 或 b
(?=...) 正向先行斷言 — 後面跟著
(?!...) 否定先行斷言 — 後面不跟著
(?<=...) 正向後行斷言 — 前面是
(?<!...) 否定後行斷言 — 前面不是
$1 $<n> 替換字串裡的反向參照 — 數字或命名

為什麼選 iKit Regex 測試器

為開發者打造的乾淨、快速 regex 遊樂場 — 沒有彈出廣告,也沒有第三方追蹤。

即時 match 標示

輸入 pattern 的同時,所有 match 即時在測試字串裡高亮顯示。Capture group 也會列在旁邊,清楚標出位置與內容。

Match + replace 一站搞定

切到 Replace 模式即時預覽 String.replace 的輸出,完整支援 $1/$2 數字反向參照、$ 命名 group、以及 $&(整個 match)。

支援全部 6 個 JavaScript 旗標

global、忽略大小寫、multiline、dotall、unicode、sticky 都做成晶片切換 — 與原生 RegExp 完全一致,複製到程式碼裡不會出意外。

常見模式範例

Email、URL、IPv4、電話、日期、十六進位色碼、UUID 一鍵帶入,每個範例都附測試字串,讓你直接看到實際 match 範圍。

內建速查表

字元類別、量詞、錨點、群組、先行/後行斷言一覽 — 可摺疊,需要時打開,平常收起來不擋路。

隱私至上的設計

Pattern、測試字串、替換字串都留在你的瀏覽器。可在 DevTools → Network 驗證:輸入時零網路請求。可放心測試正式日誌與客戶資料的 regex。

Regex 比對的運作原理

正規表達式看起來像亂碼,但它背後的引擎其實很單純。

  1. 1

    編譯 pattern

    當你寫下 /foo/,或呼叫 new RegExp('foo'),引擎會把 pattern 解析成一個內部自動機(automaton)— 一個能在輸入文字上行走的狀態機。編譯只發生一次,後續比對速度很快。

  2. 2

    在輸入字串上行走

    引擎在測試字串上移動游標。在每個位置嘗試走完自動機的路徑:符合的字元同時前進兩個游標,不符合就回溯到前一個分歧點換另一條路試。

  3. 3

    Capture group

    Pattern 裡的括號開啟一個 capture group:當引擎在括號內成功比對時,會記住比對到的內容,索引為 $1$2…。命名 group (?<n>...) 則用名稱儲存。這些 capture 出現在 match 物件的 groups 欄位。

  4. 4

    用 backreference 替換

    String.replace(regex, replacement) 走相同的 match 路徑,但不是回傳結果,而是把替換字串拼進去。替換字串裡的 $1 就是 group 1 抓到的內容 — 用一條 regex 就能把 2024-01-15 改成 15/01/2024

Regex 常見任務

你會在哪些情境下需要 regex 測試器?

驗證 email / URL 格式

在測試器建構 pattern,貼上樣本(包括正常的邊界案例),確認實際 match 範圍後,再把它放進你的表單驗證。Preset 提供了一個能涵蓋 95% 真實輸入的合理起點。

清理日誌資料

日誌裡混雜時間戳、ANSI 顏色碼、想遮蔽的 IP?切到 Replace 模式,用 \b(?:\d{1,3}\.){3}\d{1,3}\b 配上 [REDACTED],先看預覽再用 sed 跑真實檔案。

用 regex 重構程式碼

IDE 的 find-and-replace 雖然支援 regex,但不會跨多筆樣本即時預覽。先在 iKit 用真實程式片段建構並驗證,確認 group 與替換無誤後,再貼回 VS Code / IntelliJ。

抽取結構化資料

想從聯絡人匯出檔抓出所有 email,或從收據裡抽出每筆金額?在 iKit 建好 regex,複製到一行 script(text.matchAll(re)),臨時的解析任務瞬間變成十行程式。

為什麼本地 regex 測試很重要

Regex pattern 經常隱含敏感資訊:客戶 ID 結構、內部 API 路徑、密碼規則、或你正在試圖遮蔽的 PII 欄位。把它們(以及搭配的真實測試資料)貼到別人的伺服器,等於同時洩漏 pattern 與輸入。iKit 的 regex 測試器只是已載入瀏覽器分頁的 JavaScript。

  • 比對與替換期間零網路請求 — 可在 DevTools 驗證。
  • Pattern 與測試字串只存在瀏覽器記憶體;按 Clear 或重新整理就清掉。
  • 可放心使用正式環境日誌遮蔽 pattern、客戶資料驗證、與安全敏感的 regex。

相關教學

來自 iKit 部落格的深入教學與工具比較。

常見問題

支援哪一種 regex 語法?

JavaScript / ECMAScript regex(就是瀏覽器原生 RegExp 用的引擎)。它是 POSIX 的嚴格超集,常用功能也與 Python re、Java Pattern、PCRE 大量重疊。差異要注意:JavaScript 支援 lookahead/lookbehind、命名 group(/(?...)/),以及 /u、/y 旗標;但不支援 possessive 量詞(a++、a*+)、原子群組((?>...))、與 branch-reset 群組 — 那些是 PCRE 特有。

我的 pattern 或測試字串會被上傳嗎?

不會。整個工具就是這個分頁裡的 JavaScript。Pattern 編譯、matching、replacement 全都用瀏覽器原生 RegExp 在本地執行。打開 DevTools → Network 觀察:輸入時不會發任何請求。可以放心貼上正式日誌、客戶 email、或任何不該被伺服器記錄的內容。

Replace 裡 $1 跟 $<name> 有什麼差別?

兩者都是替換字串裡的反向參照。$1、$2… 對應 pattern 裡 capture group 的順序 — (foo)(bar) 會讓 $1 = 'foo'、$2 = 'bar'。$ 對應命名 capture group(?...),可讀性更高,而且 pattern 裡 group 順序變動時不會影響參照。JavaScript 也有 $&(整個 match)、$`(match 之前的字串)、$'(match 之後的字串)。

為什麼我的 lookbehind 不能用?

Lookbehind (?<=...) 與 (?

怎麼比對 emoji、重音字元或非拉丁文字?

打開 /u(unicode)旗標,然後在 pattern 裡使用 Unicode 屬性轉義。`\p{L}` 可以比對任何字母 — 包括 ñ、é、中、ก、ا。`\p{N}` 比對任何數字,包括阿拉伯數字 ٠-٩ 等非拉丁數字。`\p{Emoji}` 比對 emoji 的 code point。沒開 /u 時,同樣的 pattern 在 surrogate-pair emoji(BMP 外的字元)上會靜默漏比對,重音字元也會被當成底字 + 結合符號的組合。打開 /u 後,引擎會把輸入當成 Unicode code point 處理,而不是原始 UTF-16 code unit — 多數跨語系的 regex bug 就此消失。