在之前的章節中,我們已經學會了使用 LIKE ...% 進行簡單的模糊匹配。然而,當面對更複雜的字串模式比對需求時,LIKE 子句往往力有未逮。MySQL 提供了更強大的 REGEXP 操作符,支援完整的正則表達式匹配功能,讓資料篩選更加精準靈活。
如果您熟悉 PHP、Perl 或 JavaScript 的正則表達式語法,MySQL 的 REGEXP 將讓您如魚得水。其語法與這些主流腳本語言高度一致,學習成本極低。透過 REGEXP,您可以輕鬆實現:郵箱格式驗證、電話號碼提取、特定模式的資料清洗等進階操作。
下表列出了 REGEXP 操作符中最常用的模式元字符與說明:
| 模式 | 描述與行為 |
|---|---|
^ | 匹配字串開頭。若啟用 Multiline 模式,也匹配 \n 或 \r 之後的位置。 |
$ | 匹配字串結尾。若啟用 Multiline 模式,也匹配 \n 或 \r 之前的位置。 |
. | 匹配除換行符 \n 外的任意單一字符。需匹配含換行的任意字符時,請使用 [.\n] 模式。 |
[...] | 字符集合。匹配方括號內任一字符。例:[abc] 可匹配 "plain" 中的 'a'。 |
[^...] | 負向字符集合。匹配未列出的任意字符。例:[^abc] 可匹配 "plain" 中的 'p'。 |
p1|p2|p3 | 多選分支。匹配 p1 或 p2 或 p3。例:z|food 匹配 "z" 或 "food";(z|f)ood 匹配 "zood" 或 "food"。 |
* | 匹配前面的子表達式零次或多次。zo* 匹配 "z"、"zo"、"zoo"。等價於 {0,}。 |
+ | 匹配前面的子表達式一次或多次。zo+ 匹配 "zo"、"zoo",但不匹配 "z"。等價於 {1,}。 |
{n} | n 為非負整數。精確匹配 n 次。例:o{2} 無法匹配 "Bob" 的單個 'o',但能匹配 "food" 的雙 'o'。 |
{n,m} | n、m 為非負整數且 n ≤ m。最少匹配 n 次、最多 m 次。 |
假設我們有一張 person_tbl 表,包含 name 欄位。以下範例展示如何靈活運用 REGEXP 解決實際查詢需求:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
WHERE 先用索引欄位過濾,再套用 REGEXP。^ 錨定開頭時盡量使用,減少回溯開銷。掌握 MySQL 正則表達式,能讓您在資料清洗、異常檢測、複雜報表查詢中遊刃有餘。建議收藏本速查表,實戰中靈活組合各模式元字符,發揮 REGEXP 的最大威力。