跳到主要內容

開發者工具 / 038

正則表達式測試器

即時測試 JavaScript 正則表達式,高亮匹配內容並列出擷取群組;比對在獨立 Worker 中執行並設有逾時保護。

/ /g

修飾詞

g:全域,找出所有符合而不只第一個

常用範例

比對結果

0 個符合

命中位置

活動從 2026-08-01 到 2026-08-31,報名截止 2026-07-15。

比對跑在 Web Worker 裡並設有 1 秒逾時。這是因為使用者自己寫的正則就足以讓瀏覽器凍結 (災難性回溯),單純限制輸入長度擋不住——短字串一樣能觸發。

為什麼做這個

測試正則時,除了看有沒有匹配,也要能看到群組與修飾詞的效果。部分正則可能造成大量回溯,因此比對會放在獨立 Worker 中,超過時間就停止執行。

這個工具怎麼用

填入正則與測試文字就會即時比對,停止打字約 0.25 秒後開始計算。命中的部分會用反色標出來,下方逐筆列出每個結果的起始位置、完整命中內容,以及每一個擷取群組的值。

修飾詞的影響很大。 沒有 `g` 只會找第一個符合的;`m` 讓 `^` 與 `$` 對每一行生效而不是整段文字;`s` 讓 `.` 也能匹配換行。每個按鈕都附了說明,切換後下方會列出目前生效的修飾詞在做什麼。

擷取群組是正則最實用的部分。`(\d{4})-(\d{2})-(\d{2})` 不只判斷格式對不對,還能把年、月、日分別取出來。具名群組 `(?<year>\d{4})` 則讓程式碼裡可以用名字取值而不是數字索引,可讀性好得多——工具會把兩種都列出來。

比對跑在 Web Worker 裡並設有 1 秒逾時。 這是因為正則有個著名的陷阱叫災難性回溯:`(a+)+$` 這類巢狀量詞遇到不匹配的輸入時,引擎會嘗試指數量級的組合,三十幾個字元就足以讓分頁凍結數分鐘。超時的時候工具會告訴你這件事,而不是讓你以為工具壞了——如果你的正則會在這裡逾時,放進正式環境就是一個阻斷服務的漏洞。

拿幾個常見的格式練習最快:`(\d{4})-(\d{2})-(\d{2})` 比對 `2026-10-06`,三個群組分別取出年、月、日;改成具名群組 `(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})` 之後,結果會用名稱而不是編號呈現,維護時比較不容易搞混。`^09\d{8}$` 可以檢查台灣手機號碼的格式(09 開頭共 10 碼),`^[A-Z][12]\d{8}$` 可以檢查身分證字號的外形,但它們只檢查格式,不代表號碼真的存在或校驗碼正確。

寫正則時有幾個習慣能減少錯誤:用 `^` 與 `$` 把整串字串框起來(否則字串中間符合也算成功)、量詞盡量寫成具體範圍而不是 `.*`、需要字面意義的特殊字元(`.`、`?`、`+`、`(`)一律用反斜線跳脫。先用這裡的即時標示確認命中的範圍,再貼進程式碼。

常見問題

什麼是災難性回溯(ReDoS)?

正則引擎在比對失敗時會回頭嘗試其他可能的切分方式。巢狀量詞如 `(a+)+` 讓可能的切分方式隨輸入長度指數成長,於是一個三十幾字元的輸入就能讓引擎跑上幾分鐘。攻擊者只要送出這樣的字串就能癱瘓伺服器,所以它被當成一種漏洞。

我的正則逾時了,怎麼改?

找出巢狀的量詞——形如 `(x+)+`、`(x*)*`、`(x+)*` 或 `(a|a)+` 的結構。通常可以改寫成單層量詞(`(a+)+` 直接寫成 `a+` 效果相同但不會回溯爆炸),或用更精確的字元類別限制引擎能嘗試的範圍。另外把 `.*` 換成 `[^,]*` 這類具體的排除類別也很有效。

為什麼只找到一個結果?

檢查有沒有開 `g`(全域)修飾詞。沒有 `g` 的正則只會回傳第一個符合的結果,這是 JavaScript 的預設行為。工具在這種情況下會提示你。

支援具名群組嗎?

支援。用 `(?<name>...)` 語法定義,工具會在每一筆結果下另外列出具名群組的值。這個語法需要現代瀏覽器,實務上都沒問題。

跟正則的語法差異有關係嗎?

有。這個工具用的是 JavaScript 的正則引擎,跟 PCRE(PHP、Perl)、Python 的 `re`、Go 的 RE2 在某些語法上不同——例如 JavaScript 沒有 `\A`、`\z`,lookbehind 的支援也較晚才加入。測試結果適用於 JavaScript 環境,搬到別的語言前要確認語法。

可以用正則驗證 Email 嗎?

只能做粗略的格式檢查,例如有 @ 且前後都有內容。完整的 Email 規則(RFC 5322)極為複雜,用正則寫出來既難讀又容易誤判。實務上的做法是格式寬鬆檢查加上寄驗證信,確認對方真的收得到。