REGEXP 讓 SQL 擁有比 LIKE 強大得多的模式比對能力,支援 POSIX 正則語法。本文從建表測試資料出發,逐步講解字元匹配、邊界、字元類、量詞、分組、轉義與大小寫控制,附效能建議。
CREATE TABLE t_regcustomer (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(256),
age INT
) ENGINE=InnoDB CHARSET=utf8mb4;
INSERT INTO t_regcustomer(name,age) VALUES
('王明',20),('王大',21),('小王',22),('小王2',22),
('鵬鵬',18),('鵬鵬1',18),('大鵬',20),('大鵬2',20),('大鵬3',20),
('AAA',17),('aaa',17),('SS',17),('s2',17),('ss',17);
| 語法 | 說明 | 範例 | 匹配結果 |
|---|---|---|---|
. | 任意單一字元 | name REGEXP '.鵬.' | 鵬鵬、大鵬2、小鵬 |
^pattern | 開頭匹配 | name REGEXP '^王' | 王明、王大 |
pattern$ | 結尾匹配 | name REGEXP '鵬$' | 鵬鵬、大鵬 |
[abc] | 字元集合 (任一) | name REGEXP '鵬[123]' | 鵬鵬1、大鵬1、大鵬2、大鵬3 |
[0-9] | 範圍 | name REGEXP '鵬[0-9]' | 同上 |
[^0-9] | 排除範圍 | name REGEXP '[^0-9]' | 非純數字 |
| | 或邏輯 | name REGEXP '王|鵬' | 含王或鵬 |
* + ? | 量詞 0*/1+/0-1 | name REGEXP '鵬[0-9]+' | 鵬後接 1 位以上數字 |
{n,m} | 量詞範圍 | name REGEXP '[0-9]{1,3}' | 1-3 位數字 |
[[:digit:]] | POSIX 字元類 | name REGEXP '[[:digit:]]' | 含數字 |
\\ | 轉義 (MySQL 需雙重) | name REGEXP '\\.' | 字面點號 |
BINARY | 大小寫敏感 | name REGEXP BINARY '^s' | 僅小寫 s 開頭 |
[[:<:]] [[:>:]] | 單詞邊界 | name REGEXP '[[:<:]]王' | 王為單詞開頭 |
LIKE 'prefix%' 走索引過濾大部份資料,再套用 REGEXP 精準匹配。RLIKE (同義詞) 保持語義清晰。REGEXP_REPLACE()、REGEXP_SUBSTR()、REGEXP_INSTR(),支援擷取/替換/位置。