如何使用正規表達式測試
- 在「正規表達式」欄位輸入樣式,不需要前後的斜線,例如 \d{4}-\d{2}-\d{2}。
- 勾選需要的旗標:g 全域、i 忽略大小寫、m 多行、s dotAll、u Unicode、y 黏著。
- 在「測試文字」貼上內容,「比對結果」會即時標示符合處,「符合清單」列出位置與群組。
- 要測試取代時,在「取代為」輸入 $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>。
我的測試文字會被上傳嗎?
不會。比對完全在你的瀏覽器中進行。工具會在本機記住你上次輸入的樣式與文字,方便下次繼續使用,按「清除」即可移除。
最後更新: