什麼是正規表示式?
正規表示式(Regex)是用來描述文字的規則,例如「四個數字、一個連字號、兩個數字」。開發時常用來驗證輸入、搜尋日誌、擷取資料或大量取代文字。這個工具使用瀏覽器內建的 JavaScript 引擎,結果和瀏覽器、Node.js 裡 String.prototype.match 與 replace 的結果相同。
使用方式
- 輸入表示式(不用加前後的斜線),勾選需要的旗標。
- 貼上要測試的文字,每個符合處都會標示出來;相鄰的符合處用不同顏色,方便分辨。
- 表格列出每個符合處的位置與擷取群組。點一下某一列,就會在文字中選取該處。
- 填寫「取代為」就能預覽取代結果。群組用
$1、$<name>,整段符合文字用$&。
範例:改變日期格式
表示式 (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) 會找出 2024-03-15 這類日期,並替三個部分命名。取代為 $<day>/$<month>/$<year> 的結果是:
15/03/2024
常用語法
| 語法 | 意思 |
|---|---|
\d | 一個數字 0-9 |
\w | 英文字母、數字或底線 |
\s | 空白字元:空格、Tab、換行 |
. | 換行以外的任何字元(開啟 s:任何字元) |
* + ? | 0 次以上、1 次以上、0 或 1 次 |
{2,4} | 2 到 4 次 |
^ $ | 文字的開頭與結尾(開啟 m:每一行) |
\b | 單字邊界 |
[abc] [^abc] | a、b、c 其中一個/除此之外的字元 |
a|b | a 或 b |
(...) | 擷取群組:取代時用 $1、$2 |
(?:...) | 只分組、不擷取 |
(?<name>...) | 具名群組:取代時用 $<name> |
(?=...) (?!...) | 後面接著/後面不是(前瞻) |
常見問題
這裡用的是哪一種正規表示式?
JavaScript(ECMAScript),和瀏覽器、Node.js 相同。大部分語法在 Java、Python、PHP、Go 也通用,但有些差異:Python 的具名群組寫成 (?P<name>...);寫在表示式開頭的 (?i) 這類旗標這裡不支援,請改用旗標勾選框。
為什麼測試到一半顯示逾時?
有些表示式,特別是像 (a+)+$ 這種重複裡又有重複的寫法,會讓引擎嘗試極大量的組合(稱為「災難性回溯」)。這個工具在背景執行,超過 2 秒就停止,頁面不會卡住。請改寫表示式、避免巢狀重複,同樣的表示式也可能讓你的伺服器卡住。
反斜線要寫兩個嗎?
在這裡不用,直接輸入 \d。複製到 Java、C# 或 JavaScript 程式的字串裡(不是 /.../ 寫法)時,每個反斜線都要寫兩次,例如 "\\d{4}"。
文字會傳送到伺服器嗎?
不會。比對與取代全部在你的瀏覽器執行,可以放心拿不能外流的日誌或資料來測試。