MySQL REGEXP 正則表達式:語法詳解與高級實戰
MySQL REGEXP 操作符支持正則表達式模式匹配,功能遠超 LIKE。本文系統整理元字符、字符類、量詞、定位符及實戰技巧。
核心元字符速查表
| 元字符 | 含義 | 示例匹配 |
^ | 字符串開始 | '^st' 匹配以 st 開頭 |
$ | 字符串結束 | 'ok$' 匹配以 ok 結尾 |
. | 任意單字符 | 'a.c' 匹配 abc, axc |
[...] | 字符集合 | '[aeiou]' 匹配任意元音 |
[^...] | 排除字符集 | '[^0-9]' 匹配非數字 |
p1|p2|p3 | 分支/或 | 'cat|dog|fish' |
* | 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{2,4}' 匹配 aa, aaa, aaaa |
字符類別簡寫
| POSIX 類別 | 等價於 | 說明 |
[:alnum:] | [a-zA-Z0-9] | 字母數字 |
[:alpha:] | [a-zA-Z] | 字母 |
[:digit:] | [0-9] | 數字 |
[:lower:] | [a-z] | 小寫字母 |
[:upper:] | [A-Z] | 大寫字母 |
[:space:] | [ \t\r\n\v\f] | 空白字符 |
[:blank:] | [ \t] | 空格和製表符 |
[:punct:] | [-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~] | 標點符號 |
[:xdigit:] | [0-9a-fA-F] | 十六進制數字 |
定位符與邊界
| 定位符 | 含義 |
^ | 字符串開始 |
$ | 字符串結束 |
[[:<:]] | 詞邊界開始 |
[[:>:]] | 詞邊界結束 |
實戰示例
1. 基礎模式匹配
-- 以 st 開頭
SELECT name FROM person WHERE name REGEXP '^st';
-- 以 ok 結尾
SELECT name FROM person WHERE name REGEXP 'ok$';
-- 包含 mar
SELECT name FROM person WHERE name REGEXP 'mar';
-- 以元音開頭或以 ok 結尾
SELECT name FROM person WHERE name REGEXP '^[aeiou]|ok$';
2. 範圍與重複
-- 匹配 1-5 後跟 Ton
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton';
-- 匹配連續 4 位數字
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}';
-- 等價於
SELECT prod_name FROM products WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]';
3. 特殊字符轉義
-- 匹配字面點號
SELECT * FROM t WHERE col REGEXP '\\.';
-- 匹配字面反斜杠
SELECT * FROM t WHERE col REGEXP '\\\\';
4. 詞邊界精確匹配
-- 匹配獨立單詞 word
SELECT * FROM t WHERE col REGEXP '[[:<:]]word[[:>:]]';
-- 匹配以 wee 或 week 開頭,以 knights 或 nights 結尾
SELECT 'weeknights' REGEXP '^(wee|week)(knights|nights)$'; -- 1 (匹配)
REGEXP vs LIKE 關鍵差異
| 特性 | LIKE | REGEXP |
| 匹配範圍 | 整列匹配 | 子串匹配(除非用 ^$ 定位) |
| 通配符 | % _ | 完整正則語法 |
| 大小寫敏感 | 取決於校對規則 | 默認不敏感,用 BINARY 區分 |
| 性能 | 較快(可用索引前綴) | 較慢(全表掃描) |
大小寫敏感控制
-- 不區分大小寫(默認)
SELECT 'Hello' REGEXP 'hello'; -- 1
-- 區分大小寫
SELECT 'Hello' REGEXP BINARY 'hello'; -- 0
SELECT 'Hello' REGEXP BINARY 'Hello'; -- 1
性能優化建議
- 避免在大表全字段使用 REGEXP,優先用
LIKE 'prefix%' 利用索引
- 將正則條件放在
WHERE 後面,配合其他索引條件過濾
- 複雜正則考慮應用層處理或使用全文索引
- MySQL 8.0+ 支持
REGEXP_LIKE()、REGEXP_SUBSTR()、REGEXP_REPLACE() 更豐富函數
copyright ©
萬盛學電腦網 all rights reserved