基礎語法
SELECT * FROM table_name WHERE column_name REGEXP 'pattern';
-- 或不區分大小寫
SELECT * FROM table_name WHERE column_name REGEXP 'pattern' COLLATE utf8mb4_general_ci;
元字符速查表
| 元字符 | 含義 | 示例 | 匹配樣例 |
^ | 字符串開頭 | '^A' | Apple, Admin |
$ | 字符串結尾 | 'ing$' | Testing, Running |
. | 任意單字符(含換行) | 'a.c' | abc, axc, a-c |
[abc] | 字符集合:任一字符 | '[aeiou]' | 包含任意元音 |
[^abc] | 排除字符集合 | '[^0-9]' | 非數字字符 |
| | 或邏輯 | 'cat|dog|fish' | 包含 cat 或 dog 或 fish |
* | 前字符 0 次或多次 | 'ab*c' | ac, abc, abbc, abbbc... |
+ | 前字符 1 次或多次 | 'ab+c' | abc, abbc, abbbc... (不匹配 ac) |
{n} | 前字符恰好 n 次 | 'a{3}' | aaa |
{m,n} | 前字符 m 到 n 次 | 'ab{1,3}' | ab, abb, abbb |
實戰案例
1. 驗證郵箱格式(簡化版)
SELECT email FROM users
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
2. 查找包含中文的記錄
SELECT * FROM articles
WHERE content REGEXP '[\\x{4e00}-\\x{9fa5}]';
-- 注意:MySQL 8.0+ 支持 Unicode 屬性 \p{Han}
3. 提取手機號(中國大陸)
SELECT phone FROM contacts
WHERE phone REGEXP '^1[3-9]\\d{9}$';
4. 模糊匹配多個關鍵詞
SELECT * FROM products
WHERE name REGEXP 'iPhone|iPad|MacBook|Apple Watch';
進階技巧
捕獲組與替換 (MySQL 8.0+)
-- 將電話號碼格式化:13800138000 -> 138-0013-8000
SELECT REGEXP_REPLACE(phone, '^(\\d{3})(\\d{4})(\\d{4})$', '\\1-\\2-\\3') AS formatted
FROM contacts;
性能優化建議
- 避免前導通配符:
'%abc%' (LIKE) 或 '.*abc' (REGEXP) 導致全表掃描。
- 錨定開頭:
'^abc' 可利用索引(前綴索引)。
- 複雜正則考慮應用層處理:數據庫擅長集合運算,複雜文本解析建議在應用層完成。
REGEXP **不使用索引**(MySQL 8.0 前),全表掃描。大表慎用,或配合全文索引/應用層預過濾。
REGEXP vs LIKE
| 特性 | LIKE | REGEXP |
| 通配符 | % (任意長度), _ (單字符) | 完整正則元字符集 |
| 性能 | 較快,前綴可用索引 | 較慢,通常全表掃描 |
| 適用場景 | 簡單前綴/後綴/包含匹配 | 複雜格式驗證、提取、轉換 |
| 大小寫敏感 | 取決於排序規則 | 取決於排序規則,可用 COLLATE 指定 |