基本用法
SELECT prod_name FROM products WHERE prod_name REGEXP 'pattern';
- 預設不區分大小寫,需區分加
BINARY:REGEXP BINARY 'Pattern'。
REGEXP 在欄值內部匹配,LIKE 整欄匹配。
元字元速查表
| 元字元 | 說明 | 範例 |
. | 任意單字元 | '.000' 匹配 1.000, 2.000 |
| | OR | '1000|2000' |
[...] | 字元類別 | '[123]ton' 匹配 1ton,2ton,3ton |
[^...] | 排除類別 | '[^0-9]' 非數字 |
* | 0 或多次 | |
+ | 1 或多次 | |
? | 0 或 1 次 | |
{n} | 恰好 n 次 | |
{n,} | 至少 n 次 | |
{n,m} | n 到 m 次 (m≤255) | '[0-9]{1,3}' |
^ | 字串開頭 | '^王' |
$ | 字串結尾 | 'ing$' |
[[:<:]] | 詞首邊界 | |
[[:>:]] | 詞尾邊界 | |
POSIX 字元類別(需雙層括號)
| 類別 | 等價 | 說明 |
[[:alnum:]] | [a-zA-Z0-9] | 字母數字 |
[[:alpha:]] | [a-zA-Z] | 字母 |
[[:digit:]] | [0-9] | 數字 |
[[:lower:]] | [a-z] | 小寫 |
[[:upper:]] | [A-Z] | 大寫 |
[[:space:]] | [ \t\n\r\f\v] | 空白字元 |
[[:xdigit:]] | [a-fA-F0-9] | 十六進制 |
實戰範例
-- 1. 匹配產品名含 .000
SELECT prod_name FROM products WHERE prod_name REGEXP '\\.000';
-- 2. 價格 1000 或 2000
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000';
-- 3. 以數字開頭的名稱
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9]';
-- 4. 包含連續 1-3 位數字
SELECT prod_name FROM products WHERE prod_name REGEXP '[0-9]{1,3}';
效能提醒
REGEXP 導致全表掃描,大表慎用。可考慮:前綴 LIKE 過濾 → 應用層正則;或 MySQL 8.0 函數索引;或匯出至 Elasticsearch 全文檢索。