正規表示式測試
用你的文字測試正規表示式,即時標出每一個比對結果,並以白話拆解表示式中每個部分的作用。
在你的瀏覽器中執行
這個表示式的意思
讀懂別人寫的表示式
正規表示式的問題多半是「看不懂」:某人幾年前把一段表示式貼進驗證邏輯,之後就沒有人說得出它到底 接受什麼。下方的解說面板會把表示式拆成一個個構件並逐一說明,依序排列、按群組縮排,讓表示式可以 用讀的,而不是用猜的。
比對結果會在你輸入的同時標示在測試文字上,最常見的兩種錯誤因此一眼可見:比對範圍比預期大,或是 在單字中間比對到、而不是整個單字。
旗標
| 旗標 | 作用 |
|---|---|
g | 找出全部,而不只是第一筆 |
i | 忽略大小寫 |
m | ^ 與 $ 在每個換行處生效,而不只是整段文字的頭尾 |
s | . 也會比對到換行 |
u | Unicode 模式,可使用 \u{…} 與 \p{…} |
m 是最常被需要、也最常被忘記設定的旗標。沒有它,^ 只錨定整段文字的開頭,逐行比對的表示式
會安靜地只比對到一次就停住。
預設是貪婪的
.* 與 .+ 會先盡量吃掉最多的字元,再一個個吐回來,直到剩下的表示式能接上為止。對
<b>one</b> <b>two</b> 來說,<b>.*</b> 會比對到整串,而不是第一組標籤。加上 ? 讓量詞變成
非貪婪,<b>.*?</b> 就會停在第一個結束標籤。
一個字元的差別,就是「只抓到一個欄位」和「抓到整份文件」的差別。
災難性回溯
巢狀量詞搭配互相重疊的選項,例如 (a+)+$,在比對不到的輸入上會花費指數級的時間。幾十個字元就
足以讓引擎完全卡死——由於這個測試工具是在你自己的分頁裡執行,這樣的表示式也會讓這個頁面凍結。
線上服務被這種表示式拖垮的案例並不罕見;常見的修法是讓內層的選項互斥,讓引擎沒有可回溯的空間。
各家流派並不相同
這個頁面使用瀏覽器本身的 JavaScript 引擎,所以你看到的結果就是 RegExp 的行為。其他流派相近但
不完全一樣:
- 後行斷言
(?<=…)在 JavaScript、Python 與 .NET 可用,但 Go 的 RE2 與多數 POSIX 工具不支援。 - 在 JavaScript 中
\d指的是 ASCII 數字(未加u時),Python 3 預設則會比對所有文字系統的數字。 - 具名群組在 JavaScript 與 .NET 是
(?<name>…),在 Python 是(?P<name>…)。
要在正式環境使用之前,請在實際會執行它的環境裡再測一次。
你的資料只留在這裡
表示式與文字都在你的瀏覽器中執行,不會傳送到任何地方。當你拿來測試的樣本是真實的日誌或客戶 資料時,這點特別重要。