當 LIKE 與通配符無法滿足複雜文本過濾時,REGEXP 提供強大的模式匹配能力。本文基於《MySQL必知必會》學習筆記,系統梳理 10 大核心技巧,含字符匹配、OR 分支、字符集、範圍、轉義、字符類、量詞、定位符,附實戰 SQL 與結果圖解。
SELECT * FROM table WHERE column REGEXP 'pattern';
REGEXP 不區分大小寫(預設),區分大小寫用 REGEXP BINARY。REGEXP_LIKE()、REGEXP_SUBSTR()、REGEXP_REPLACE() 等函數。SELECT * FROM student WHERE name REGEXP '1'; -- 含字符 '1' 的記錄

SELECT * FROM student WHERE name REGEXP '123|456'; -- 含 123 或 456

SELECT * FROM student WHERE name REGEXP '[02468]'; -- 含任意偶數數字
等價於 0|2|4|6|8。

SELECT * FROM student WHERE name REGEXP '[0-9]'; -- 任意數字 SELECT * FROM student WHERE name REGEXP '[a-z]'; -- 任意小寫字母 SELECT * FROM student WHERE name REGEXP '[A-Z]'; -- 任意大寫字母

元字符 . [ ] ( ) | * + ? ^ $ { } \ 需雙反斜杠轉義。
SELECT * FROM student WHERE name REGEXP '\\.'; -- 匹配字面點號
不轉義 . 會匹配任意單字符。

MySQL 使用 POSIX 字符類,不同於 PCRE 的 \d \w \s。
| 字符類 | 含義 | 等價寫法 |
|---|---|---|
| [:digit:] | 數字 | [0-9] |
| [:alpha:] | 字母 | [a-zA-Z] |
| [:alnum:] | 字母數字 | [a-zA-Z0-9] |
| [:lower:] | 小寫字母 | [a-z] |
| [:upper:] | 大寫字母 | [A-Z] |
| [:space:] | 空白字符 | [ \t\r\n\v\f] |
| [:punct:] | 標點符號 | 標點字符集 |

SELECT * FROM student WHERE name REGEXP '[[:digit:]]'; -- 含數字
| 量詞 | 含義 | 示例 |
|---|---|---|
| * | 0 次或多次 | 'ab*c' 匹配 ac, abc, abbc... |
| + | 1 次或多次 | 'ab+c' 匹配 abc, abbc... |
| ? | 0 次或 1 次 | 'ab?c' 匹配 ac, abc |
| {n} | 恰好 n 次 | 'a{3}' 匹配 aaa |
| {n,} | 至少 n 次 | 'a{2,}' 匹配 aa, aaa... |
| {n,m} | n 到 m 次 | 'a{1,3}' 匹配 a, aa, aaa |
SELECT * FROM student WHERE name REGEXP 'rang?'; -- ran 或 rang



| 定位符 | 含義 |
|---|---|
| ^ | 字符串開頭(集合內 [^...] 表示排除) |
| $ | 字符串結尾 |
| [[:<:]] | 單詞左邊界 |
| [[:>:]] | 單詞右邊界 |
SELECT * FROM student WHERE name REGEXP '^\\.'; -- 以點開頭


SELECT * FROM student WHERE name REGEXP '[^0-9]'; -- 含非數字字符
SELECT email FROM users
WHERE email REGEXP '^[[:alnum:]_.-]+@[[:alnum:]-]+\\.[[:alpha:]]{2,}$';
「不要強迫自己背誦細節,多寫幾遍、查幾次手冊,肌肉記憶自然形成。需要時現查現用,效率最高。」
REGEXP 會全表掃描,必要時建全文索引或應用層預過濾。掌握這 10 大技巧,覆蓋 95% 以上的業務文本匹配場景。