正規表示式測試工具

輸入正規表示式模式和測試字串,即可高亮顯示匹配部分並列出捕獲組的值。支援 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 標誌。
  • 點選"插入示例"按鈕可以載入郵箱地址提取的示例,是理解捕獲組行為的一個很好的起點。
  • 本工具的所有匹配處理都在瀏覽器內完成,輸入的模式和測試字串不會發送到任何伺服器。

常見問題

如果不加 g(global)標誌,正規表示式只會匹配字串中的第一處,之後出現的匹配都會被忽略。如果想找出所有匹配項,請務必開啟 g 標誌。

基本語法([abc]\d+* 等)大體相通,但命名分組的寫法、先行/後行斷言的支援情況以及可用標誌在不同語言之間存在細微差異。本工具遵循 JavaScript 的 RegExp 規範,不保證在其他語言中行為完全一致。

不會。所有處理都在瀏覽器內的 JavaScript 中完成,輸入內容不會發送或儲存到 toolbase.cc 的伺服器。

當 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 新增的相對較新的特性。用名稱而非編號引用分組,能大幅提升複雜模式的可讀性,在解析日期等需要明確"每個分組代表什麼"的場景中尤其有用。