如何測試一個正規表達式?

輸入一個樣式與一段範例文字,工具就會標示出每一處比對、列出擷取群組,並讓你開關全域、多行、忽略大小寫等旗標。比對在你的瀏覽器中以 JavaScript 內建的正規表達式引擎執行,所以結果與你的程式碼所見的完全一致。

完全在瀏覽器內執行 · 不上傳 · 不需要帳號 · 無浮水印

  1. 輸入一個樣式,並勾選你要的旗標。
  2. 貼上一些用來比對的範例文字。
  3. 先看標示,再看下方的比對清單。
旗標

標示

比對結果

    這個頁面能做什麼

    什麼時候該用這個工具

    • 拿一個 JavaScript 正規表達式去試一段範例字串。
    • 看看哪些擷取群組與旗標會產生哪些比對。
    • 在把樣式放進前端程式碼之前先做一次合理性檢查。

    什麼時候不該用

    • 樣式針對的是 Python、PCRE、.NET 或 Java —— 它們的語法與回溯行為不同於 JavaScript 的 RegExp。
    • 輸入不可信,且樣式可能發生災難性回溯;測試在主執行緒上執行,可能凍結分頁。
    • 你需要逐步解釋、效能基準測試或逾時控制。

    和其他做法相比,差在哪裡

    regex101 之類的工具讓你切換引擎、逐一解釋每個符號並設定逾時。本頁執行瀏覽器內建的 RegExp,沒有那些保護,所以它忠於 JavaScript,也繼承了它的限制:沒有原子群組、沒有佔用量詞,也沒有針對病態樣式的防護。一個刻意寫壞的表達式能讓分頁一路卡到你關閉它。

    你的檔案去了哪裡

    哪裡也沒去。這個頁面只載入了做事的程式碼,之後你開啟的檔案由你自己的瀏覽器讀取。沒有上傳步驟,沒有暫時的伺服器副本,也沒有需要你信任的清理流程——資料從未經過網路,所以事後沒有任何東西需要刪除。你可以自己確認:在工具執行時打開瀏覽器的網路面板,看它一直保持安靜。

    關於這個工具的問題

    我用我的樣式時頁面卡住了,為什麼?
    那是災難性回溯:像 (a+)+b 這樣的樣式去比對一長串「a」,會讓引擎嘗試指數級多的失敗路徑。本頁為比對數量設了上限,所以它不會無限打轉,但單一頑固的比對仍可能需要一點時間。請改寫巢狀量詞,讓引擎只有一條路徑 —— 例如 a+b —— 或者用 ^ 或 $ 為樣式加上錨點。
    我能開啟哪些旗標?
    g 找出每一處比對而不是第一處,i 忽略大小寫,m 讓 ^ 與 $ 在換行處比對,s 讓 . 也比對換行,u 開啟完整的 Unicode 模式 —— 這是 \p{...} 屬性逸出以及正確處理基本平面之外字元所必需的。結果與 JavaScript 內建引擎給出的完全一致,所以它們與你的程式碼相符。
    為什麼只列出了幾千筆比對?
    清單設了上限,好讓一個逐字元比對的樣式 —— 例如在長文件上帶全域旗標的 . —— 不會在它建立數千列時把分頁鎖死。這個上限對現實中的測試字串足夠高;如果你撞上了它,請縮小樣式或縮短範例。

    同組的其他工具