如何測試一個正規表達式?
輸入一個樣式與一段範例文字,工具就會標示出每一處比對、列出擷取群組,並讓你開關全域、多行、忽略大小寫等旗標。比對在你的瀏覽器中以 JavaScript 內建的正規表達式引擎執行,所以結果與你的程式碼所見的完全一致。
完全在瀏覽器內執行 · 不上傳 · 不需要帳號 · 無浮水印
- 輸入一個樣式,並勾選你要的旗標。
- 貼上一些用來比對的範例文字。
- 先看標示,再看下方的比對清單。
標示
比對結果
這個頁面能做什麼
- 即時標示每一處比對
- 列出每個比對的位移與擷取群組
- 開關 g、i、m、s、u 旗標
- 報告不合法的樣式,而不是默默失敗
什麼時候該用這個工具
- 拿一個 JavaScript 正規表達式去試一段範例字串。
- 看看哪些擷取群組與旗標會產生哪些比對。
- 在把樣式放進前端程式碼之前先做一次合理性檢查。
什麼時候不該用
- 樣式針對的是 Python、PCRE、.NET 或 Java —— 它們的語法與回溯行為不同於 JavaScript 的 RegExp。
- 輸入不可信,且樣式可能發生災難性回溯;測試在主執行緒上執行,可能凍結分頁。
- 你需要逐步解釋、效能基準測試或逾時控制。
和其他做法相比,差在哪裡
regex101 之類的工具讓你切換引擎、逐一解釋每個符號並設定逾時。本頁執行瀏覽器內建的 RegExp,沒有那些保護,所以它忠於 JavaScript,也繼承了它的限制:沒有原子群組、沒有佔用量詞,也沒有針對病態樣式的防護。一個刻意寫壞的表達式能讓分頁一路卡到你關閉它。
你的檔案去了哪裡
哪裡也沒去。這個頁面只載入了做事的程式碼,之後你開啟的檔案由你自己的瀏覽器讀取。沒有上傳步驟,沒有暫時的伺服器副本,也沒有需要你信任的清理流程——資料從未經過網路,所以事後沒有任何東西需要刪除。你可以自己確認:在工具執行時打開瀏覽器的網路面板,看它一直保持安靜。
關於這個工具的問題
- 我用我的樣式時頁面卡住了,為什麼?
- 那是災難性回溯:像 (a+)+b 這樣的樣式去比對一長串「a」,會讓引擎嘗試指數級多的失敗路徑。本頁為比對數量設了上限,所以它不會無限打轉,但單一頑固的比對仍可能需要一點時間。請改寫巢狀量詞,讓引擎只有一條路徑 —— 例如 a+b —— 或者用 ^ 或 $ 為樣式加上錨點。
- 我能開啟哪些旗標?
- g 找出每一處比對而不是第一處,i 忽略大小寫,m 讓 ^ 與 $ 在換行處比對,s 讓 . 也比對換行,u 開啟完整的 Unicode 模式 —— 這是 \p{...} 屬性逸出以及正確處理基本平面之外字元所必需的。結果與 JavaScript 內建引擎給出的完全一致,所以它們與你的程式碼相符。
- 為什麼只列出了幾千筆比對?
- 清單設了上限,好讓一個逐字元比對的樣式 —— 例如在長文件上帶全域旗標的 . —— 不會在它建立數千列時把分頁鎖死。這個上限對現實中的測試字串足夠高;如果你撞上了它,請縮小樣式或縮短範例。