正規表達式測試

輸入正規表達式與測試文字,立即看到哪些地方符合、每個群組擷取到什麼,以及取代後的結果。

旗標
比對結果
常用語法速查
語法意義範例
. 任意一個字元(不含換行,加 s 旗標才包含) a.c 符合 abc、a1c
\d \D 數字 0–9/非數字 \d{3} 符合 123
\w \W 英數字與底線/其他字元 \w+ 符合 user_01
\s \S 空白字元(空格、Tab、換行)/非空白 a\sb 符合 a b
\b 單字邊界(只對英數字有效) \bcat\b 不符合 category
^ $ 開頭/結尾(加 m 旗標時為每一行) ^\d+$ 整行都是數字
[abc] [^abc] 其中一個字元/以外的字元 [aeiou] 母音
[a-z0-9] 字元範圍 [A-F0-9] 十六進位
* + ? 0 次以上/1 次以上/0 或 1 次 colou?r 符合 color、colour
{n} {n,} {n,m} 剛好 n 次/至少 n 次/n 到 m 次 \d{2,4}
*? +? 非貪婪:盡可能少比對 <.+?> 只比對一個標籤
(abc) 擷取群組,可用 $1 參照 (\d+)-(\d+)
(?:abc) 只分組不擷取 (?:ab)+
(?<name>abc) 具名群組,可用 $<name> 參照 (?<year>\d{4})
a|b 或 cat|dog
(?=abc) (?!abc) 正向/負向先行斷言 \d+(?=元) 只取金額數字
(?<=abc) (?<!abc) 正向/負向後行斷言 (?<=\$)\d+
\1 反向參照第 1 個群組 (\w)\1 符合 aa、ll
\p{Script=Han} 中文字(需要 u 旗標) \p{Script=Han}+
\u4e00 \x41 Unicode/十六進位字元 [\u4e00-\u9fff]
取代語法代表
$1、$2… 第 n 個擷取群組
$<name> 具名群組
$& 整個符合的文字
$` $' 符合位置之前/之後的文字
$$ 一個 $ 符號

如何使用正規表達式測試

  1. 在「正規表達式」欄位輸入樣式,不需要前後的斜線,例如 \d{4}-\d{2}-\d{2}。
  2. 勾選需要的旗標:g 全域、i 忽略大小寫、m 多行、s dotAll、u Unicode、y 黏著。
  3. 在「測試文字」貼上內容,「比對結果」會即時標示符合處,「符合清單」列出位置與群組。
  4. 要測試取代時,在「取代為」輸入 $1、$<name> 等語法,下方會顯示取代結果預覽。

旗標的作用

g(global)會找出所有符合,沒有它只會回傳第一個;i 讓比對不分大小寫;m(multiline)讓 ^ 與 $ 比對每一行的開頭與結尾,而不只是整段文字的頭尾(沒有 m 時,^ 只代表整段文字的最開頭);s(dotAll)讓 . 也能比對換行字元。

u(unicode)會以完整的 Unicode 碼位處理文字,表情符號等超出基本平面的字元才會被當成一個字元,也才能使用 \p{Script=Han} 這類 Unicode 屬性;y(sticky)則要求比對必須從目前位置開始,常用在撰寫詞法分析器。

中文與常見格式的寫法

比對中文字最可靠的寫法是開啟 u 旗標後使用 \p{Script=Han},它涵蓋各個擴充區的漢字;常見的 [\u4e00-\u9fff] 只包含基本區,會漏掉部分罕用字。另外,\w 與 \b 只認得英數字與底線,對中文沒有作用,這是很常見的誤解。

台灣手機號碼可用 ^09\d{8}$;日期 YYYY-MM-DD 可用 \d{4}-\d{2}-\d{2},但它不會檢查月份是否超過 12。Email 的完整規格非常複雜,實務上用 ^[^\s@]+@[^\s@]+\.[^\s@]+$ 做基本檢查,再以寄送驗證信確認即可。

什麼是災難性回溯?

當樣式中出現巢狀的重複,例如 (a+)+$ 或 (\w+\s?)*$,而文字又剛好「幾乎符合卻失敗」時,正規表達式引擎會嘗試指數級數量的組合,可能讓頁面卡住數分鐘,這就是災難性回溯(Catastrophic Backtracking),也是 ReDoS 攻擊的原理。

本工具在背景執行緒中執行比對,超過 1.5 秒會自動中止並提示你,最多也只列出 1,000 個符合,避免瀏覽器當機。改善方法包括移除不必要的巢狀量詞、讓相鄰的部分不要比對到相同字元,以及盡量寫得具體,例如用 [^"]* 取代 .*,並先用較短的測試文字確認行為。

常見問題

這裡的語法和 Python、PHP 一樣嗎?

本工具使用瀏覽器的 JavaScript 正規表達式引擎。基本語法大致相同,但細節有差異,例如 Python 的具名群組寫成 (?P<name>…),JavaScript 則是 (?<name>…);PHP 的 PCRE 支援的部分進階語法 JavaScript 沒有。

為什麼 \d 在程式裡要寫成 \\d?

在程式碼的字串中,反斜線本身需要跳脫,所以 new RegExp("\\d+") 才等於 /\d+/。在本工具輸入時直接寫 \d 即可,不需要雙反斜線。

貪婪與非貪婪有什麼不同?

量詞預設是貪婪的,會盡量比對最多字元;在後面加上 ? 變成非貪婪,盡量比對最少。例如對「<a><b>」使用 <.+> 會一次比對整段,<.+?> 則分別比對 <a> 與 <b>。

我的測試文字會被上傳嗎?

不會。比對完全在你的瀏覽器中進行。工具會在本機記住你上次輸入的樣式與文字,方便下次繼續使用,按「清除」即可移除。

最後更新: