MySQL 正則表達式 REGEXP 完全指南:模式匹配實戰
MySQL REGEXP 提供比 LIKE 更強大的模式匹配能力,支援字符類、量詞、定位符等。本文系統講解語法差異、核心元字符、實用範例。
一、REGEXP vs LIKE 關鍵差異
| 特性 | LIKE | REGEXP |
| 匹配範圍 | 整列值(需通配符才能匹配子串) | 列值任意位置(子串匹配) |
| 大小寫敏感 | 依 collation | 默認不敏感,可用 BINARY 強制區分 |
| 元字符支援 | 僅 % _ | 完整正則語法 |
示例: WHERE col REGEXP 'hello' 匹配包含 "hello" 的任意行;WHERE col REGEXP BINARY 'Hello' 區分大小寫。
二、核心元字符速查表
| 元字符 | 說明 | 示例 |
. | 匹配任意單字符 | '.og' 匹配 dog, hog, mog |
| | 或運算 | 'cat|dog' 匹配 cat 或 dog |
[...] | 字符集合 | '[456]' 匹配 4/5/6;'[a-z]' 匹配小寫字母 |
[^...] | 排除字符集合 | '[^0-9]' 非數字 |
* | 前字符 0 次或多次 | 'ab*c' 匹配 ac, abc, abbc... |
+ | 前字符 1 次或多次 | 'ab+c' 匹配 abc, abbc... |
? | 前字符 0 次或 1 次 | 'sticks?' 匹配 stick 或 sticks |
{n} | 前字符恰好 n 次 | '[0-9]{4}' 匹配 4 位數字 |
{m,n} | 前字符 m 到 n 次 | '[0-9]{3,5}' 3-5 位數字 |
^ | 行首定位 | '^abc' 以 abc 開頭 |
$ | 行尾定位 | 'abc$' 以 abc 結尾 |
\\ | 轉義特殊字符 | '\\.' 匹配字面點號 |
[:class:] | 字符類 | '[[:digit:]]' = '[0-9]';'[[:alpha:]]' 字母 |
三、實戰範例
-- 1. 基本字符匹配
SELECT * FROM products WHERE prod_name REGEXP '1000';
-- 2. OR 匹配
SELECT * FROM products WHERE prod_name REGEXP '1000|2000';
-- 3. 字符集合:名稱包含 4 或 5 或 6
SELECT * FROM products WHERE prod_name REGEXP '[456]';
-- 4. 範圍匹配:名稱包含 1-3 任一數字
SELECT * FROM products WHERE prod_name REGEXP '[1-3]';
-- 5. 匹配特殊字符:查找包含 "." 的行
SELECT * FROM products WHERE prod_name REGEXP '\\.';
-- 6. 字符類:匹配連續 4 位數字
SELECT * FROM products WHERE prod_name REGEXP '[[:digit:]]{4}';
-- 7. 定位符:以 "abc" 開頭
SELECT * FROM products WHERE prod_name REGEXP '^abc';
-- 8. 定位符:以 "xyz" 結尾
SELECT * FROM products WHERE prod_name REGEXP 'xyz$';
-- 9. 無表測試正則(返回 0/1)
SELECT 'hello' REGEXP '^h'; -- 1
SELECT 'hello' REGEXP '^x'; -- 0
SELECT 'HELLO' REGEXP BINARY '^h'; -- 0 (區分大小寫)
四、常用字符類對照表
| 字符類 | 等價 | 說明 |
[[:digit:]] | [0-9] | 數字 |
[[:alpha:]] | [a-zA-Z] | 字母 |
[[:alnum:]] | [0-9a-zA-Z] | 字母數字 |
[[:lower:]] | [a-z] | 小寫字母 |
[[:upper:]] | [A-Z] | 大寫字母 |
[[:space:]] | [ \\t\\r\\n\\v\\f] | 空白字符 |
[[:punct:]] | 標點符號 | 標點 |
五、性能提示
REGEXP 無法使用普通索引(MySQL 8.0+ 支援函數索引),大表全表掃描較慢。
- 可結合
LIKE 先粗略過濾,再用 REGEXP 精確匹配。
- 避免過度複雜的正則,必要時在應用層處理。