正規表示式測試工具
輸入正規表示式模式和測試字串,即可高亮顯示匹配部分並列出捕獲組的值。支援 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)組成。 |
使用提示
- 模式輸入框右側顯示的
/標誌可以讓你一眼確認當前啟用了哪些標誌組合。 - 只有用
()括起來的部分才算捕獲組。如果只是想分組條件而不想讓捕獲組列表變得雜亂,可以使用非捕獲組(?:...)。 - 不開啟 g 標誌時只會匹配第一處。如果想統計文本中所有出現的位置,請務必開啟 g 標誌。
- 點選"插入示例"按鈕可以載入郵箱地址提取的示例,是理解捕獲組行為的一個很好的起點。
- 本工具的所有匹配處理都在瀏覽器內完成,輸入的模式和測試字串不會發送到任何伺服器。
常見問題
[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 新增的相對較新的特性。用名稱而非編號引用分組,能大幅提升複雜模式的可讀性,在解析日期等需要明確"每個分組代表什麼"的場景中尤其有用。