資料表 items 中 name 欄位混雜中英文,需分別篩選:
entry name cost
123 魔法披風 100
124 角斗士勳章 200
125 Maxcuh 300 ← 純英文
126 勇者徽章 400
127 Ulisanise 500 ← 純英文
128 HP回復 600
-- 方法一:使用字符類 [[:alpha:]]
SELECT * FROM items WHERE name REGEXP '^[[:alpha:]]+$';
-- 方法二:排除非字母開頭
SELECT * FROM items WHERE name NOT REGEXP '^[^A-Za-z]';
結果:僅返回 entry 125 (Maxcuh) 和 127 (Ulisanise)。
-- 方法一:匹配中文 Unicode 範圍 (MySQL 8.0+)
SELECT * FROM items WHERE name REGEXP '[\\x{4e00}-\\x{9fa5}]';
-- 方法二:排除純英文數字
SELECT * FROM items WHERE name REGEXP '[^A-Za-z0-9]';
| 元字符 | 說明 | 範例 |
|---|---|---|
^ | 字符串開頭 | '^abc' 匹配以 abc 開頭 |
$ | 字符串結尾 | 'abc$' 匹配以 abc 結尾 |
. | 任意單字符 | 'a.c' 匹配 aac, abc, acc... |
* | 零次或多次 | 'ab*c' 匹配 ac, abc, abbc... |
+ | 一次或多次 | 'ab+c' 匹配 abc, abbc... (不含 ac) |
? | 零次或一次 | 'ab?c' 匹配 ac, abc |
[abc] | 字符集合 | '[aeiou]' 匹配任一母音 |
[^abc] | 排除字符集 | '[^0-9]' 匹配非數字 |
[[:alpha:]] | 字母字符類 | 等同 [A-Za-z] |
[[:digit:]] | 數字字符類 | 等同 [0-9] |
[[:alnum:]] | 字母數字類 | 等同 [A-Za-z0-9] |
-- 單詞邊界 [[:<:]] [[:>:]] (MySQL 8.0 棄用,改用 \\b)
SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -- 1 (匹配)
SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -- 0 (不匹配)
SELECT 'weeknights' REGEXP '^(wee|week)(knights|nights)$'; -- 1
-- [[=o=]] 匹配 o 及其等價字符(如帶音標字符)
LIKE,複雜模式才用 REGEXP掌握 REGEXP 可大幅簡化複雜字符串篩選邏輯,是資料清洗與分析的利器。