正規表示式測試工具
輸入正規表示式模式和測試字串,即可高亮顯示匹配部分並列出捕獲組的值。支援 g/i/m/s/u 標誌,直接使用 JavaScript 原生 RegExp。
常用正規表示式模式一覽
| 用途 | 模式 | 說明 |
|---|---|---|
| 郵箱地址 | ^[\w.+-]+@[\w-]+\.[\w.-]+$ | 匹配由使用者名稱和域名以 @ 分隔組成的簡化郵箱地址格式(並非完全符合 RFC 規範)。 |
| 中國大陸手機號 | ^1[3-9]\d{9}$ | 匹配以1開頭、第二位為3-9的11位中國大陸手機號碼。 |
| URL 網址 | https?:\/\/[\w.-]+(?:\/[\w\-./?%&=]*)? | 提取以 http:// 或 https:// 開頭的網址字串,包含路徑和查詢引數。 |
| 中國郵政編碼 | ^\d{6}$ | 匹配由6位數字組成的中國郵政編碼。 |
| HEX 顏色程式碼 | ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$ | 匹配 CSS 中使用的完整 #RRGGBB 格式或簡寫 #RGB 格式的顏色程式碼。 |
| 僅限數字 | ^[0-9]+$ | 驗證字串是否完全由半形數字(0-9)組成。 |
什麼是正規表示式測試工具
正規表示式(Regular Expression)是一種精簡的迷你語言,用來在文字中搜尋、擷取與驗證特定模式。像是「判斷字串是否符合電子郵件格式」「只從記錄檔中取出IP位址」這類工作,都能用一條模式表達出來。缺點是符號組合相當獨特,僅憑閱讀很難判斷模式是否會如預期運作。
本工具會即時以 JavaScript 原生的 RegExp 引擎解析你輸入的模式與測試字串,並在文字中把符合的部分以黃色反白顯示。同時也會列出每個擷取組的值、符合總數以及語法錯誤內容,讓你能一邊微調模式一邊確認「目前符合到哪裡」,整個嘗試錯誤的過程都能在瀏覽器內完成,不需要撰寫程式碼或架設執行環境。
正規表示式測試工具的使用方法
-
輸入正規表示式模式
在最上方的欄位輸入要測試的模式。前後的斜線
/ /會自動補上,只需輸入模式本體即可。 - 選擇需要的旗標 依需求勾選 g、i、m、s、u 旗標。若想查看所有符合項目而非只有第一個,請保持 g 旗標開啟。
- 輸入測試字串 將要比對的文字貼到下方的文字框中,支援多行文字。
- 確認反白結果與清單 每次輸入都會自動重新計算,符合的部分會以黃色反白顯示。下方表格會逐筆列出完整符合內容與各擷取組的值。
- 調整模式 若符合數量或範圍與預期不同,可直接修改模式或旗標,觀察結果變化來微調。
用好本工具的小技巧
- 模式輸入框右側顯示的
/標誌可以讓你一眼確認當前啟用了哪些標誌組合。 - 只有用
()括起來的部分才算捕獲組。如果只是想分組條件而不想讓捕獲組列表變得雜亂,可以使用非捕獲組(?:...)。 - 不開啟 g 標誌時只會匹配第一處。如果想統計文本中所有出現的位置,請務必開啟 g 標誌。
- 點選"插入示例"按鈕可以載入郵箱地址提取的示例,是理解捕獲組行為的一個很好的起點。
- 本工具的所有匹配處理都在瀏覽器內完成,輸入的模式和測試字串不會發送到任何伺服器。
正規表示式測試工具的應用情境
設計表單驗證規則
在把正規表示式接入表單驗證邏輯之前,先在這裡驗證預期的輸入(是否有連字號、是否含全形字元等)能否通過,以及不合法的輸入是否會被正確擋下。
從伺服器記錄檔擷取欄位
把存取記錄或錯誤記錄的真實片段貼進來,建立只擷取IP位址、時間戳記、狀態碼等特定欄位的模式。
清理CSV或文字資料
在統一格式不一致的電話號碼或日期寫法之前,可用來分類確認哪些行符合某個模式、哪些不符合。
程式碼審查時確認行為
當同事寫的正規表示式意圖不易一眼看懂時,貼上實際的範例值並將符合範圍視覺化,能當場解決審查中的疑問。
檢查修改模式的副作用
修改既有的正規表示式時,用同一份測試字串比對修改前後的反白結果,確認行為沒有出現非預期的變化。
正規表示式相關術語表
- 擷取組
- 模式中以
()括起來的部分。當你不只需要整體符合結果,還想單獨取出其中一部分時使用。本工具的結果表會依「組1」「組2」依序列出各組的值。 - 非擷取組
- 寫作
(?:...)形式的組。若只是想用括號把條件組合起來、不想影響擷取組的編號,使用它可讓結果清單保持清晰。 - 反向參照
- 在同一模式中重複使用先前某個擷取組已符合內容的寫法。編號組以
\1參照,具名組則以\k<name>參照,常用於偵測連續重複的單字。 - 非貪婪符合
- 在量詞(如
*、+)後面加上?,會讓符合範圍盡可能短。預設的貪婪符合會盡可能符合較長的內容,在擷取單一HTML標籤內容等需要限定範圍的情境中,兩者差異相當關鍵。 - 前瞻與後顧
(?=...)(正向前瞻)、(?!...)(負向前瞻)、(?<=...)(正向後顧)、(?<!...)(負向後顧)的統稱。它們可以要求前後存在特定文字,但不會把該文字包含進符合結果中。- 字元類別
- 以方括號括起來的一組字元,例如
[abc]或[a-z0-9],表示符合其中任一字元。在開頭加上^,例如[^abc],則表示「不包含這些字元」。 - 錨點
- 不符合具體字元、而是符合位置的記法。
^表示字串(開啟m旗標時為每一行)的開頭,$表示結尾,\b表示單字邊界。 - 旗標
- 用來改變整個正規表示式解析方式的選項。本工具支援 g(尋找所有符合項目)、i(忽略大小寫)、m(多行模式)、s(讓點號也符合換行字元)、u(正確處理Unicode)這5種旗標。
常見問題
[abc]、\d、+、* 等)大體相通,但命名分組的寫法、先行/後行斷言的支援情況以及可用標誌在不同語言之間存在細微差異。本工具遵循 JavaScript 的 RegExp 規範,不保證在其他語言中行為完全一致。*、+、?)前面沒有可修飾的對象,或字元類寫法不合法等。錯誤資訊通常會給出提示,請檢查括號是否配對、特殊字元是否已正確轉義(如 \. 或 \()。
閒話 ― 正規表示式引擎內部發生了什麼
正規表示式的理論源頭可以追溯到20世紀50年代數學家斯蒂芬·克萊尼(Stephen Kleene)提出的"正則語言"理論。早期 Unix 的文本編輯器 ed 以及命令 grep(globally search a Regular Expression and Print 的縮寫)將這套理論落地為實用工具,這也是正規表示式能在文本處理工具中迅速普及的原因之一。grep 這個名字本身就源自一條正規表示式操作命令,頗具象徵意義。
JavaScript 的 RegExp 引擎內部採用"回溯法"進行匹配:按順序嘗試模式中的每個元素,一旦某部分失敗就退回上一步重新嘗試。這種方式雖然靈活,但像 (a+)+b 這樣的模式配合較長的不匹配字串時,嘗試次數可能呈指數級增長,即所謂的"災難性回溯(catastrophic backtracking)",嚴重時會導致瀏覽器或伺服器卡死。在生產程式碼中使用複雜模式前,務必用各種輸入進行充分測試。
帶有全域性(g)標誌的正規表示式物件內部會儲存一個名為 lastIndex 的游標,每次呼叫 exec() 都會從該位置繼續搜尋。如果重複使用同一個正則物件進行不相關的搜尋,這個游標可能會遺留意外狀態,因此本工具每次都會建立全新的 RegExp 例項,以避免狀態被意外帶入下一次匹配。
命名捕獲組((?<name>...))是 ECMAScript 2018 新增的相對較新的特性。用名稱而非編號引用分組,能大幅提升複雜模式的可讀性,在解析日期等需要明確"每個分組代表什麼"的場景中尤其有用。