給人類看的正規表達式:實用指南
正規表達式(regex)有個名聲問題。它們看起來像有人在鍵盤上睡著了:^[\w.-]+@[\w-]+\.[\w.]+$。它們出現在程式碼審查、文字編輯器、搜尋工具和表單驗證中。開發者要麼喜歡它們,要麼完全避免使用它們。
真相介於兩者之間。Regex 確實很強大。一開始也確實令人困惑。但你不需要掌握每個晦澀的功能才能獲得實際價值。少數幾個模式就能覆蓋絕大多數實際使用案例。
Regex 實際上做什麼
正規表達式是描述一組字串的模式。你把它交給搜尋工具,它會找到每個符合該模式的字串。把它想成一個非常精確的搜尋查詢。
普通搜尋:找到確切的「hello」 Regex 搜尋:找到任何看起來像電子郵件地址、電話號碼、日期、URL 或你能描述的任何其他模式的內容。
你知道嗎? 正規表達式是數學家 Stephen Kleene 於 1956 年發明的,作為描述形式語言理論中「正規語言」的記號。它們在 1960 年代和 1970 年代通過早期的 Unix 文字編輯器進入電腦運算領域。
基本構件
字面字元
最簡單的 regex 就是字面文字。模式 hello 匹配字串「hello」。沒有什麼特別的。
點(.)——任意單一字元
點匹配任意單一字元(換行符除外)。
h.t匹配「hat」、「hit」、「hot」、「hut」,甚至「h3t」
字元類別([])——特定字元
方括號定義該位置允許的字元集合。
[aeiou]匹配任意單一元音[0-9]匹配任意數字[A-Za-z]匹配任意字母(大寫或小寫)[^0-9]匹配任意非數字的字元(括號內的^表示「非」)
量詞——數量
這些符號控制重複:
| 符號 | 含義 | 範例 | 匹配 |
|---|---|---|---|
* |
零個或多個 | ab*c |
「ac」、「abc」、「abbc」、「abbbc」 |
+ |
一個或多個 | ab+c |
「abc」、「abbc」、「abbbc」(不匹配「ac」) |
? |
零個或一個 | colou?r |
「color」和「colour」 |
{3} |
恰好 3 個 | a{3} |
「aaa」 |
{2,4} |
2 到 4 個之間 | a{2,4} |
「aa」、「aaa」、「aaaa」 |
錨點——位置
- 開頭的
^表示「字串開始」 - 結尾的
$表示「字串結束」 ^hello$只匹配確切的字串「hello」,而不匹配「say hello」或「hello world」
簡寫字元類別
常見字元類別有快捷方式:
| 簡寫 | 等同 | 含義 |
|---|---|---|
\d |
[0-9] |
任意數字 |
\w |
[A-Za-z0-9_] |
任意「單字」字元 |
\s |
[ \t\n\r] |
任意空白字元 |
\D |
[^0-9] |
任意非數字 |
\W |
[^A-Za-z0-9_] |
任意非單字字元 |
\S |
[^ \t\n\r] |
任意非空白字元 |
群組(())——分組和捕獲
圓括號將模式的各部分分組。這對於將量詞應用於群組或提取匹配的特定部分很有用。
(ab)+匹配「ab」、「abab」、「ababab」(\d{3})-(\d{4})匹配「555-1234」並分別捕獲「555」和「1234」
管道符(|)——或
管道符表示「或」。
cat|dog匹配「cat」或「dog」(jpg|png|gif)匹配這三個圖片副檔名中的任意一個
今天就可以使用的實用模式
匹配電子郵件地址(簡單版)
[\w.-]+@[\w-]+\.[\w.]+
分解:
[\w.-]+——一個或多個單字字元、點或連字號(本地部分)@——字面 @ 符號[\w-]+——一個或多個單字字元或連字號(域名)\.——字面點(因為.是特殊字元,需要轉義)[\w.]+——一個或多個單字字元或點(頂級域名)
警告 用 regex 驗證電子郵件是出了名的難以做到完美。上面的簡單模式涵蓋了 99% 的實際電子郵件地址,但並不處理 RFC 規範中定義的每個邊緣情況。對於生產環境的驗證,請使用你程式語言的電子郵件驗證程式庫。
匹配電話號碼(美國格式)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
這匹配:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
匹配 URL
https?://[\w.-]+(/[\w./-]*)?
這匹配:
匹配日期(YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
這匹配:2026-03-23、1999-12-31 等。
找出重複的單字
\b(\w+)\s+\1\b
這匹配重複的單字,如「the the」或「is is」。\1 指回第一個群組捕獲的內容。
匹配 IPv4 地址
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
這匹配像 192.168.1.1 或 10.0.0.255 這樣的模式。
撰寫 Regex 的提示
1. 從簡單開始,然後精煉
不要嘗試在第一次嘗試時就寫出完美的 regex。從廣泛的模式開始,用你的資料測試,然後縮緊它。
2. 始終測試
Regex 很容易出錯。缺少量詞或未轉義的點可能完全改變匹配的內容。在生產環境中使用之前,始終用真實資料測試你的模式。
3. 轉義特殊字元
如果你需要匹配字面的點、圓括號、方括號或其他特殊字元,用反斜線轉義它:\.、\(、\[。
4. 使用注釋和命名群組
在複雜模式中,使用命名群組和注釋(在支援的地方)使 regex 可讀。你未來的自己會感謝你。
5. 了解何時不使用 Regex
Regex 是解析 HTML、XML、JSON 或任何巢狀結構的錯誤工具。對這些使用適當的解析器。
提示 即時測試和除錯你的 regex 模式:如何測試 Regex 模式。貼上你的模式和測試資料,即時看到匹配高亮顯示。
立即開始測試 regex:
免費、即時回饋,且不需要註冊。