基本用法
SELECT prod_name FROM products WHERE prod_name REGEXP 'pattern';
REGEXP 在欄位值**內部**匹配(LIKE 整個欄位匹配)
- 預設**不區分大小寫**,需區分加
BINARY:REGEXP BINARY 'Jet'
元字符速查表
| 元字符 | 說明 | 範例 |
. | 任意單字符 | '.000' 匹配 1.000, 2.000 |
| | OR 邏輯 | '1000|2000' |
[...] | 字符集合 | '[123]ton' 匹配 1ton, 2ton, 3ton |
[^...] | 排除字符集合 | '[^0-9]' 非數字 |
\\ | 轉義(MySQL 需雙反斜線) | '\\.000' 匹配字面 .000 |
^ | 字符串開頭(集合外) | '^abc' |
$ | 字符串結尾 | 'abc$' |
[[:<:] | 單詞開頭 | '[[:<:]]word' |
[[:>:]] | 單詞結尾 | 'word[[:>:]]' |
POSIX 字符類別
| 類別 | 等價 | 說明 |
[[:alnum:]] | [a-zA-Z0-9] | 字母數字 |
[[:alpha:]] | [a-zA-Z] | 字母 |
[[:digit:]] | [0-9] | 數字 |
[[:lower:]] | [a-z] | 小寫 |
[[:upper:]] | [A-Z] | 大寫 |
[[:space:]] | [\\f\\n\\r\\t\\v] | 空白字符 |
[[:xdigit:]] | [a-fA-F0-9] | 十六進制 |
使用時外層加方括號:REGEXP '[[:digit:]]'
量詞
| 量詞 | 說明 |
* | 0 次或多次 |
+ | 1 次或多次 |
? | 0 次或 1 次 |
{n} | 恰好 n 次 |
{n,} | 至少 n 次 |
{n,m} | n 到 m 次 (m ≤ 255) |
實用範例
-- 1. 以數字開頭的產品名
SELECT * FROM products WHERE prod_name REGEXP '^[0-9]';
-- 2. 包含 1-3 位數字
SELECT * FROM products WHERE prod_name REGEXP '[0-9]{1,3}';
-- 3. 郵箱格式簡易驗證
SELECT * FROM users WHERE email REGEXP '^[[:alnum:]_.-]+@[[:alnum:]-]+\\.[[:alpha:]]{2,}$';
-- 4. 手機號 (中國大陸)
SELECT * FROM users WHERE mobile REGEXP '^1[3-9]\\d{9}$';
-- 5. 排除特定字符
SELECT * FROM products WHERE prod_name REGEXP '[^a-zA-Z0-9]';
效能提醒
REGEXP 無法使用索引,全表掃描
- 大表建議:應用層預處理、全文索引、或導出至 Elasticsearch
- 簡單前綴匹配優先用
LIKE 'prefix%' 走索引