toolfree

正規表示式測試

用你的文字測試正規表示式,即時標出每一個比對結果,並以白話拆解表示式中每個部分的作用。

在你的瀏覽器中執行

旗標

這個表示式的意思

    讀懂別人寫的表示式

    正規表示式的問題多半是「看不懂」:某人幾年前把一段表示式貼進驗證邏輯,之後就沒有人說得出它到底 接受什麼。下方的解說面板會把表示式拆成一個個構件並逐一說明,依序排列、按群組縮排,讓表示式可以 用讀的,而不是用猜的。

    比對結果會在你輸入的同時標示在測試文字上,最常見的兩種錯誤因此一眼可見:比對範圍比預期大,或是 在單字中間比對到、而不是整個單字。

    旗標

    旗標作用
    g找出全部,而不只是第一筆
    i忽略大小寫
    m^$ 在每個換行處生效,而不只是整段文字的頭尾
    s. 也會比對到換行
    uUnicode 模式,可使用 \u{…}\p{…}

    m 是最常被需要、也最常被忘記設定的旗標。沒有它,^ 只錨定整段文字的開頭,逐行比對的表示式 會安靜地只比對到一次就停住。

    預設是貪婪的

    .*.+ 會先盡量吃掉最多的字元,再一個個吐回來,直到剩下的表示式能接上為止。對 <b>one</b> <b>two</b> 來說,<b>.*</b> 會比對到整串,而不是第一組標籤。加上 ? 讓量詞變成 非貪婪,<b>.*?</b> 就會停在第一個結束標籤。

    一個字元的差別,就是「只抓到一個欄位」和「抓到整份文件」的差別。

    災難性回溯

    巢狀量詞搭配互相重疊的選項,例如 (a+)+$,在比對不到的輸入上會花費指數級的時間。幾十個字元就 足以讓引擎完全卡死——由於這個測試工具是在你自己的分頁裡執行,這樣的表示式也會讓這個頁面凍結。 線上服務被這種表示式拖垮的案例並不罕見;常見的修法是讓內層的選項互斥,讓引擎沒有可回溯的空間。

    各家流派並不相同

    這個頁面使用瀏覽器本身的 JavaScript 引擎,所以你看到的結果就是 RegExp 的行為。其他流派相近但 不完全一樣:

    要在正式環境使用之前,請在實際會執行它的環境裡再測一次。

    你的資料只留在這裡

    表示式與文字都在你的瀏覽器中執行,不會傳送到任何地方。當你拿來測試的樣本是真實的日誌或客戶 資料時,這點特別重要。