MySQL REGEXP 操作符支援 POSIX 1003.2 標準正則表達式,可在 SQL 中直接進行複雜模式匹配。本文系統整理保留字元、量詞、字元類、邊界斷言與實戰範例。
| 語法 | 說明 | 範例 (匹配→1,不匹配→0) |
|---|---|---|
^ | 字串開頭 | '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 | 或邏輯 | 'pi' REGEXP 'pi|apa' → 1 |
(abc)* | 分組量詞 | 'pipi' REGEXP '^(pi)*$' → 1 |
{n} | 恰好 n 次 | 'aaa' REGEXP '^a{3}$' → 1 |
{n,} | 至少 n 次 | 'aaa' REGEXP '^a{2,}$' → 1 |
{n,m} | n 到 m 次 | 'aa' REGEXP '^a{1,3}$' → 1 |
[a-dX] | 字元集合 | 'aXbc' REGEXP '[a-dX]' → 1 |
[^a-dX] | 排除字元集合 | 'gheis' REGEXP '^[^a-dX]+$' → 1 |
[[:alnum:]] | POSIX 字元類(字母數字) | 'justalnums' REGEXP '[[:alnum:]]+' → 1 |
[[:digit:]] | 數字 | |
[[:alpha:]] | 字母 | |
[[:lower:]] | 小寫 | |
[[:upper:]] | 大寫 | |
[[:space:]] | 空白字元 | |
[[:punct:]] | 標點 | |
[[:xdigit:]] | 十六進位字元 | |
[[.ch.]] | 排序元素(如雙字母視為單字元) | 'chchcc' REGEXP '[[.ch.]]*c' 匹配前 5 字元 |
[[=o=]] | 等價類(如 o 與 ó 視為同類) | |
[[:<:]] | 單詞左邊界 | 'a word a' REGEXP '[[:<:]]' → 1 |
[[:>:]] | 單詞右邊界 | 'a xword a' REGEXP '[[:>:]]' → 0 |
a* ≡ a{0,}a+ ≡ a{1,}a? ≡ a{0,1}RE_DUP_MAX 預設 255。-- 查找以數字開頭的用戶名
SELECT * FROM users WHERE username REGEXP '^[[:digit:]]';
-- 查找含連續 3 個以上數字的手機號碼片段
SELECT * FROM logs WHERE message REGEXP '[[:digit:]]{3,}';
-- 查找純英文單詞(邊界斷言)
SELECT * FROM dict WHERE word REGEXP '^[[:alpha:]]+$';
-- 排除含特殊符號的記錄
SELECT * FROM comments WHERE content NOT REGEXP '[[:punct:]]';
REGEXP 無法使用索引,全表掃描。CAST(col AS CHAR) REGEXP ... 不支援索引)