正規表達式測試
即時測試 JavaScript 正規表達式:標示符合處、列出群組、預覽取代結果,附語法說明與常用範本。
/g
0 個字元 · 1 行
符合處
快捷鍵:Ctrl/⌘ + Enter 重新比對
語法說明
輸入正規表達式後,這裡會逐一說明每個部分。
常用範本
這些範本只檢查大致的格式,不保證資料真的有效(例如 Email 是否真的存在),請依需要調整。
- Email
/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/gi - 網址(http/https)
/https?:\/\/[\w-]+(?:\.[\w-]+)+(?::\d+)?(?:[/?#][^\s]*)?/gi - 台灣手機號碼
/09\d{2}-?\d{3}-?\d{3}/g - 台灣市話
/\(?0\d{1,3}\)?[-\s]?\d{3,4}-?\d{4}/g - 郵遞區號(3、5 或 6 碼)
/(?<!\d)\d{3}(?:\d{2,3})?(?!\d)/g - IPv4 位址
/\b(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\b/g - 日期 YYYY-MM-DD
/(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])/g - 時間 HH:MM(:SS)
/\b(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?\b/g - 十六進位色碼
/#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b/g - UUID
/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi - 數字(含千分位、小數)
/-?\d{1,3}(?:,\d{3})*(?:\.\d+)?|-?\d+(?:\.\d+)?/g - 中文字
/\p{Script=Han}+/gu
使用說明
- 在「正規表達式」輸入要測試的寫法(不用加前後的 /),勾選需要的旗標,例如 g(找出全部)或 i(不分大小寫)。
- 在「測試文字」貼上文字,符合處會即時標示出來,下方表格列出每個符合處與群組的內容。
- 需要時在「取代為」輸入取代文字,可用 $1、$<名稱> 插入群組,即時預覽取代結果。
- 不熟悉語法時,看「語法說明」逐一了解每個部分,或從「常用範本」選一個開始修改。
常見問題
我的資料會被上傳嗎?
不會。比對在你的瀏覽器中執行,正規表達式與文字都不會離開你的裝置。
用的是哪一種正規表達式?
使用瀏覽器內建的 JavaScript(ECMAScript)正規表達式,結果與在程式中使用 new RegExp() 相同。其他語言(PCRE、Python、Java)大部分語法相同,但有些細節不同,例如 JavaScript 的 \w 只比對英數字與底線,不包含中文字。
怎麼比對中文字?
開啟 u 旗標並使用 \p{Script=Han},例如 \p{Script=Han}+ 會比對連續的中文字;常用範本中有現成的寫法。沒有 u 旗標時,一個 emoji 會被當成兩個字元。
常用範本可以直接用來驗證資料嗎?
範本只檢查大致的格式,例如手機號碼是 09 開頭的 10 位數字,但無法確認號碼是否存在,也無法確認 Email 是否真的存在。正式驗證請搭配其他檢查。
為什麼比對被停止了?
某些寫法(例如 (a+)+$)遇到特定文字時,需要嘗試的組合會呈指數成長,可能讓瀏覽器卡住很久。為了避免頁面當掉,比對在背景執行,超過 3 秒就會自動停止並提示你。改寫成更明確的寫法(例如 a+$)通常就能解決。
位置為什麼和我數的不一樣?
位置是 JavaScript 的字串索引,以 UTF-16 計算:中文字算 1 個位置,但 emoji 等罕用字元算 2 個。這與程式中 match.index 的值相同。