MySQL 的 REGEXP 操作符支援 POSIX 正則表達式,功能比 LIKE 強大許多。本文整理所有支援的元字元、字元類別、量詞與實用查詢範例。
| 符號 | 說明 | 範例 |
|---|---|---|
^ | 字串開頭 | 'fofo' REGEXP '^fo' -- 1 |
$ | 字串結尾 | 'fono' REGEXP '^fono$' -- 1 |
. | 任意單一字元(含換行) | 'fofo' REGEXP '^f.*$' -- 1 |
a* | 0 或多個 a | 'Bn' REGEXP '^Ba*n' -- 1 |
a+ | 1 或多個 a | 'Bn' REGEXP '^Ba+n' -- 0 |
a? | 0 或 1 個 a | 'Bn' REGEXP '^Ba?n' -- 1 |
de|abc | 符合 de 或 abc | 'pi' REGEXP 'pi|apa' -- 1 |
(abc)* | 0 或多個 abc 序列 | 'pipi' REGEXP '^(pi)*$' -- 1 |
{n}, {m,n} | 精確 n 次 / m 到 n 次 | 'abcde' REGEXP 'a[bcd]{3}e' -- 1 |
[a-dX] | 字元集合(範圍 a-d 或 X) | 'aXbc' REGEXP '[a-dXYZ]' -- 1 |
[^a-dX] | 排除字元集合 | 'gheis' REGEXP '^[^a-dXYZ]+$' -- 1 |
[[:class:]] | POSIX 字元類別 | 'justalnums' REGEXP '[[:alnum:]]+' -- 1 |
[[:<:]], [[:>:]] | 單字邊界(開頭/結尾) | 'a word a' REGEXP '[[:<:]]word[[:>:]]' -- 1 |
[:alnum:] 字母數字、[:alpha:] 字母、[:digit:] 數字[:lower:] 小寫、[:upper:] 大寫、[:space:] 空白字元[:punct:] 標點、[:xdigit:] 十六進位字元在 SQL 字串中,正則的特殊字元需雙重轉義(一層給 SQL 解析器,一層給正則引擎):
-- 匹配字面 "1+2"
SELECT '1+2' REGEXP '1\\+2'; -- 1 (正確)
SELECT '1+2' REGEXP '1+2'; -- 0 (被視為 1 後面接一個以上的 +)
SELECT * FROM `products` WHERE `name` REGEXP '^[bB]';
SELECT * FROM `users` WHERE `phone` REGEXP '^09[0-9]{8}$';
SELECT * FROM `logs` WHERE `message` REGEXP '[0-9]{4,}';
SELECT * FROM `category` WHERE `path` REGEXP '^0,1,[0-9]*,$';
-- 只找獨立單字 "word"
SELECT * FROM `articles` WHERE `content` REGEXP '[[:<:]]word[[:>:]]';
REGEXP 無法使用一般 B-Tree 索引,大表會全表掃描FULLTEXT 索引或應用層預處理REGEXP_REPLACE()、REGEXP_SUBSTR() 等進階函數掌握 REGEXP 語法,能在資料清洗、格式驗證、模糊比對等場景大顯身手。