MySQL 使用 REGEXP 操作符進行正則匹配,語法:
SELECT column FROM table WHERE column REGEXP 'pattern';
支援 POSIX 正則表達式標準,不區分大小寫(可用 BINARY 強制區分)。
| 元字符 | 含義 | 示例匹配 |
|---|---|---|
^ | 字符串開頭 | '^abc' 匹配 "abc..." |
$ | 字符串結尾 | 'xyz$' 匹配 "...xyz" |
. | 任意單字符 | 'a.c' 匹配 "abc", "axc" |
[...] | 字符集合 | '[aeiou]' 匹配任一元音 |
[^...] | 排除字符集合 | '[^0-9]' 匹配非數字 |
* | 前項 0 次或多次 | 'ab*c' 匹配 "ac", "abc", "abbc" |
+ | 前項 1 次或多次 | 'ab+c' 匹配 "abc", "abbc" |
? | 前項 0 次或 1 次 | 'ab?c' 匹配 "ac", "abc" |
{n} | 前項恰好 n 次 | 'a{3}' 匹配 "aaa" |
{n,} | 前項至少 n 次 | 'a{2,}' 匹配 "aa", "aaa"... |
{n,m} | 前項 n 到 m 次 | 'a{1,3}' 匹配 "a", "aa", "aaa" |
\| | 或關係 | 'cat|dog' 匹配 "cat" 或 "dog" |
(...) | 分組 | '(ab)+' 匹配 "ab", "abab" |
-- 以 'st' 開頭 SELECT name FROM person_tbl WHERE name REGEXP '^st';
-- 以 'ok' 結尾 SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
-- 包含 'mar' SELECT name FROM person_tbl WHERE name REGEXP 'mar';
-- 以元音開頭 OR 以 'ok' 結尾 SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
-- 手機號驗證(中國大陸)
SELECT * FROM users WHERE phone REGEXP '^1[3-9][0-9]{9}$';
-- 郵箱簡易驗證
SELECT * FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
-- 純數字字符串
SELECT * FROM products WHERE sku REGEXP '^[0-9]+$';
-- 含特殊字符
SELECT * FROM logs WHERE message REGEXP '[<>\"'\\&]';
-- 日期格式 YYYY-MM-DD
SELECT * FROM events WHERE event_date REGEXP '^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$';
| 特性 | LIKE | REGEXP |
|---|---|---|
| 效能 | 快(可用索引前綴) | 慢(全表掃描,無法用索引) |
| 功能 | 簡單通配符 | 完整正則能力 |
| 適用場景 | 前綴/後綴/包含匹配 | 複雜格式驗證/數據清洗 |
name LIKE 'abc%' 可走索引MATCH...AGAINST-- 替換匹配部分
SELECT REGEXP_REPLACE('abc123def', '[0-9]+', 'XXX'); -- 返回 'abcXXXdef'
-- 提取匹配子串
SELECT REGEXP_SUBSTR('Order-12345', '[0-9]+'); -- 返回 '12345'
-- 提取第 N 個匹配
SELECT REGEXP_SUBSTR('a1b2c3', '[0-9]+', 1, 2); -- 返回 '2'