正規表示式測試工具

輸入正規表示式模式和測試字串,即可高亮顯示匹配部分並列出捕獲組的值。支援 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 引擎解析你輸入的模式與測試字串,並在文字中把符合的部分以黃色反白顯示。同時也會列出每個擷取組的值、符合總數以及語法錯誤內容,讓你能一邊微調模式一邊確認「目前符合到哪裡」,整個嘗試錯誤的過程都能在瀏覽器內完成,不需要撰寫程式碼或架設執行環境。

正規表示式測試工具的使用方法

  1. 輸入正規表示式模式 在最上方的欄位輸入要測試的模式。前後的斜線 / / 會自動補上,只需輸入模式本體即可。
  2. 選擇需要的旗標 依需求勾選 g、i、m、s、u 旗標。若想查看所有符合項目而非只有第一個,請保持 g 旗標開啟。
  3. 輸入測試字串 將要比對的文字貼到下方的文字框中,支援多行文字。
  4. 確認反白結果與清單 每次輸入都會自動重新計算,符合的部分會以黃色反白顯示。下方表格會逐筆列出完整符合內容與各擷取組的值。
  5. 調整模式 若符合數量或範圍與預期不同,可直接修改模式或旗標,觀察結果變化來微調。

用好本工具的小技巧

  • 模式輸入框右側顯示的 /標誌 可以讓你一眼確認當前啟用了哪些標誌組合。
  • 只有用 () 括起來的部分才算捕獲組。如果只是想分組條件而不想讓捕獲組列表變得雜亂,可以使用非捕獲組 (?:...)。
  • 不開啟 g 標誌時只會匹配第一處。如果想統計文本中所有出現的位置,請務必開啟 g 標誌。
  • 點選"插入示例"按鈕可以載入郵箱地址提取的示例,是理解捕獲組行為的一個很好的起點。
  • 本工具的所有匹配處理都在瀏覽器內完成,輸入的模式和測試字串不會發送到任何伺服器。

正規表示式測試工具的應用情境

設計表單驗證規則

在把正規表示式接入表單驗證邏輯之前,先在這裡驗證預期的輸入(是否有連字號、是否含全形字元等)能否通過,以及不合法的輸入是否會被正確擋下。

從伺服器記錄檔擷取欄位

把存取記錄或錯誤記錄的真實片段貼進來,建立只擷取IP位址、時間戳記、狀態碼等特定欄位的模式。

清理CSV或文字資料

在統一格式不一致的電話號碼或日期寫法之前,可用來分類確認哪些行符合某個模式、哪些不符合。

程式碼審查時確認行為

當同事寫的正規表示式意圖不易一眼看懂時,貼上實際的範例值並將符合範圍視覺化,能當場解決審查中的疑問。

檢查修改模式的副作用

修改既有的正規表示式時,用同一份測試字串比對修改前後的反白結果,確認行為沒有出現非預期的變化。

正規表示式相關術語表

擷取組
模式中以 () 括起來的部分。當你不只需要整體符合結果,還想單獨取出其中一部分時使用。本工具的結果表會依「組1」「組2」依序列出各組的值。
非擷取組
寫作 (?:...) 形式的組。若只是想用括號把條件組合起來、不想影響擷取組的編號,使用它可讓結果清單保持清晰。
反向參照
在同一模式中重複使用先前某個擷取組已符合內容的寫法。編號組以 \1 參照,具名組則以 \k<name> 參照,常用於偵測連續重複的單字。
非貪婪符合
在量詞(如 *、+)後面加上 ?,會讓符合範圍盡可能短。預設的貪婪符合會盡可能符合較長的內容,在擷取單一HTML標籤內容等需要限定範圍的情境中,兩者差異相當關鍵。
前瞻與後顧
(?=...)(正向前瞻)、(?!...)(負向前瞻)、(?<=...)(正向後顧)、(?<!...)(負向後顧)的統稱。它們可以要求前後存在特定文字,但不會把該文字包含進符合結果中。
字元類別
以方括號括起來的一組字元,例如 [abc] 或 [a-z0-9],表示符合其中任一字元。在開頭加上 ^,例如 [^abc],則表示「不包含這些字元」。
錨點
不符合具體字元、而是符合位置的記法。^ 表示字串(開啟m旗標時為每一行)的開頭,$ 表示結尾,\b 表示單字邊界。
旗標
用來改變整個正規表示式解析方式的選項。本工具支援 g(尋找所有符合項目)、i(忽略大小寫)、m(多行模式)、s(讓點號也符合換行字元)、u(正確處理Unicode)這5種旗標。

常見問題

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