首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 正則表達式 REGEXP 完整指南:模式匹配與實戰範例

     編輯:MySQL 資料庫相關知識

REGEXP 基礎語法

MySQL 使用 REGEXP 操作符進行正則匹配,語法:

SELECT column FROM table WHERE column REGEXP 'pattern';

支援 POSIX 正則表達式標準,不區分大小寫(可用 BINARY 強制區分)。

常用元字符對照表

元字符含義示例匹配
^字符串開頭'^abc' 匹配 "abc..."
$字符串結尾'xyz$' 匹配 "...xyz"
.任意單字符'a.c' 匹配 "abc", "axc"
[...]字符集合'[aeiou]' 匹配任一元音
[^...]排除字符集合'[^0-9]' 匹配非數字
*前項 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"
\|或關係'cat|dog' 匹配 "cat" 或 "dog"
(...)分組'(ab)+' 匹配 "ab", "abab"

實戰範例(假設表 person_tbl,欄位 name)

1. 以特定字符開頭

-- 以 'st' 開頭
SELECT name FROM person_tbl WHERE name REGEXP '^st';

2. 以特定字符結尾

-- 以 'ok' 結尾
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

3. 包含子字符串

-- 包含 'mar'
SELECT name FROM person_tbl WHERE name REGEXP 'mar';

4. 複雜邏輯組合

-- 以元音開頭 OR 以 'ok' 結尾
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

5. 實用業務場景

-- 手機號驗證(中國大陸)
SELECT * FROM users WHERE phone REGEXP '^1[3-9][0-9]{9}$';

-- 郵箱簡易驗證
SELECT * FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';

-- 純數字字符串
SELECT * FROM products WHERE sku REGEXP '^[0-9]+$';

-- 含特殊字符
SELECT * FROM logs WHERE message REGEXP '[<>\"'\\&]';

-- 日期格式 YYYY-MM-DD
SELECT * FROM events WHERE event_date REGEXP '^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$';

REGEXP vs LIKE 效能對比

特性LIKEREGEXP
效能快(可用索引前綴)慢(全表掃描,無法用索引)
功能簡單通配符完整正則能力
適用場景前綴/後綴/包含匹配複雜格式驗證/數據清洗

優化建議

  1. 能用 LIKE 解決絕不用 REGEXP:如前綴匹配 name LIKE 'abc%' 可走索引
  2. 應用層預過濾:程式碼中先用語言級正則驗證,入庫前保證格式
  3. 生成列 + 索引 (MySQL 5.7+):將正則提取的關鍵信息存入生成列並建索引
  4. 全文索引替代:自然語言搜尋用 MATCH...AGAINST

MySQL 8.0 新增:REGEXP_REPLACE / REGEXP_SUBSTR

-- 替換匹配部分
SELECT REGEXP_REPLACE('abc123def', '[0-9]+', 'XXX');  -- 返回 'abcXXXdef'

-- 提取匹配子串
SELECT REGEXP_SUBSTR('Order-12345', '[0-9]+');  -- 返回 '12345'

-- 提取第 N 個匹配
SELECT REGEXP_SUBSTR('a1b2c3', '[0-9]+', 1, 2);  -- 返回 '2'
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved