基礎語法與 LIKE 差異
SELECT ... WHERE col REGEXP 'pattern'
- LIKE:匹配整個列值(隱含 ^pattern$)。
- REGEXP:在列值任意位置匹配模式(類似包含匹配)。
- 預設不區分大小寫,需區分請用
REGEXP BINARY。
核心元字符與實戰範例
1. 基本字符匹配
-- 匹配以任意字符開頭、後接 000 結尾的產品名
SELECT prod_name FROM Products WHERE prod_name REGEXP '.000';
2. OR 匹配 (|)
-- 匹配含 1000 或 2000 的產品名
SELECT prod_name FROM Products WHERE prod_name REGEXP '1000|2000';
3. 字符集合 []
-- 匹配 1ton、2ton、3ton
SELECT prod_name FROM Products WHERE prod_name REGEXP '[123]ton';
4. 範圍匹配
| 模式 | 含義 |
| [0-9] | 任意數字 |
| [a-z] | 任意小寫字母 |
| [A-Z] | 任意大寫字母 |
| [^0-9] | 非數字(^ 在 [] 開頭表示否定) |
SELECT prod_name FROM Products WHERE prod_name REGEXP '[0-9]ton';
5. 特殊字符轉義
MySQL 需雙重轉義:\\. 匹配字面點號(標準正則只需 \.)。
SELECT prod_name FROM Products WHERE prod_name REGEXP '\\.000';
6. POSIX 字符類
需外層包 [],如 [[:digit:]]。
| 類別 | 等價於 | 說明 |
| [:alnum:] | [a-zA-Z0-9] | 字母數字 |
| [:alpha:] | [a-zA-Z] | 字母 |
| [:digit:] | [0-9] | 數字 |
| [:lower:] | [a-z] | 小寫 |
| [:upper:] | [A-Z] | 大寫 |
| [:space:] | [\\f\\n\\r\\t\\v] | 空白字符 |
| [:xdigit:] | [a-fA-F0-9] | 十六進制 |
SELECT * FROM mytable WHERE name REGEXP 'name[[:digit:]]';
7. 量詞(重複匹配)
| 元字符 | 說明 |
| * | 0 次或多次 |
| + | 1 次或多次 |
| ? | 0 次或 1 次 |
| {n} | 恰好 n 次 |
| {n,} | 至少 n 次 |
| {n,m} | n 到 m 次 (m ≤ 255) |
SELECT prod_name FROM Products WHERE prod_name REGEXP '[0-9]{1,3}';
8. 定位符
| 元字符 | 說明 |
| ^ | 字符串開頭(在 [] 外) |
| $ | 字符串結尾 |
| [[:<:]] | 單詞開頭 |
| [[:>:]] | 單詞結尾 |
注意:^ 在 [] 內表示否定,在外部表示開頭。
效能與最佳實踐
- 避免全表掃描:REGEXP 無法使用普通 B-Tree 索引(8.0+ 支援函數索引可部分緩解)。大表務必先用
WHERE col LIKE 'prefix%' 過濾再套 REGEXP。
- 錨定優化:模式以
^ 開頭可讓優化器嘗試索引範圍掃描。
- 複雜正則下推:極複雜模式考慮應用層預過濾或使用全文索引
MATCH...AGAINST。
- 測試工具:使用
SELECT 'test' REGEXP 'pattern' 快速驗證模式,再套用到業務查詢。
版本差異提示
- MySQL 8.0 引入
REGEXP_REPLACE()、REGEXP_SUBSTR()、REGEXP_INSTR()、REGEXP_LIKE(),兼容 ICU 正則庫,功能大增。
- 8.0 前使用 Henry Spencer 正則庫,語法子集較小,不支援前瞻/後顧、非貪婪模式等進階特性。