首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL REGEXP 正則表達式查詢完全指南

     編輯:MySQL 綜合教學

MySQL REGEXP(及同義詞 RLIKE)支援 POSIX 正則表達式,比 LIKE 更強大,適用於複雜模式匹配場景。本文系統整理語法、元字符、實戰案例與性能建議。

基本語法

SELECT * FROM table WHERE column REGEXP 'pattern';
SELECT * FROM table WHERE column RLIKE 'pattern';
SELECT * FROM table WHERE column NOT REGEXP 'pattern';
  • 匹配成功返回 1,失敗返回 0
  • 默認不區分大小寫,用 BINARY 區分:REGEXP BINARY '^A'
  • 模式匹配任意位置(非整串匹配),用 ^、$ 錨定首尾

核心元字符速查表

元字符含義示例
.任意單字符'a.c' 匹配 abc、axc
[...]字符類,匹配括號內任一字符'[abc]'、'[a-z]'、'[0-9]'
[^...]否定字符類'[^0-9]' 非數字
*前一元素 0 次或多次'ab*c' 匹配 ac、abc、abbc
+前一元素 1 次或多次'ab+c' 匹配 abc、abbc
?前一元素 0 次或 1 次'ab?c' 匹配 ac、abc
{n}恰好 n 次'a{3}' = aaa
{m,n}m 到 n 次'a{2,4}' = aa~aaaa
^字符串開頭'^abc'
$字符串結尾'abc$'
|或運算'cat|dog'
(...)分組'(ab)*' 匹配空、ab、abab
[:class:]POSIX 字符類'[[:digit:]]' = '[0-9]'
[[:<:]] [[:>:]]單詞邊界'[[:<:]]word[[:>:]]'

常用 POSIX 字符類

  • [:alnum:] 字母數字
  • [:alpha:] 字母
  • [:digit:] 數字
  • [:lower:] 小寫
  • [:upper:] 大寫
  • [:space:] 空白字符
  • [:punct:] 標點
  • [:xdigit:] 十六進制

實戰案例

1. 基礎匹配

-- 以 b 開頭
SELECT * FROM pet WHERE name REGEXP '^b';

-- 以 fy 結尾
SELECT * FROM pet WHERE name REGEXP 'fy$';

-- 包含 w
SELECT * FROM pet WHERE name REGEXP 'w';

-- 精確 5 字符
SELECT * FROM pet WHERE name REGEXP '^.{5}$';

2. 特殊字符查詢

-- 查詢包含底線 _ 的記錄(LIKE 需轉義,REGEXP 更直觀)
SELECT * FROM t WHERE col RLIKE '.[_].';

3. 複雜業務:逗號分隔字段的位置匹配

字段 t1 值如 1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2,需求:第 1、3、10 個逗號前的數字在 3-5 之間,其餘 1-5。

SELECT * FROM tb WHERE t1 REGEXP 
'^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]$';

4. 轉義特殊字符

-- 匹配字面量 '1+2'(+ 是元字符,需雙反斜槓轉義)
SELECT '1+2' REGEXP '1\\+2';  -- 返回 1

性能與最佳實踐

  1. 簡單模式用 LIKE:LIKE 'prefix%' 可用索引,REGEXP 通常全表掃描
  2. 避免前導通配符:REGEXP '^abc' 可利用索引,REGEXP 'abc' 不能
  3. 複雜正則考慮應用層:極其複雜的正則在 SQL 中難維護,建議應用層處理
  4. 測試工具:使用 SELECT 'test' REGEXP 'pattern' 快速驗證

REGEXP vs LIKE 對比

特性LIKEREGEXP
通配符%、_完整正則語法
匹配模式整串匹配子串匹配(除非用 ^$)
索引利用前綴可用極難利用
性能快慢
適用場景前綴/後綴/簡單包含複雜格式驗證、數據清洗

總結

REGEXP 是 MySQL 處理複雜文本模式的利器,但性能代價高。遵循「能用 LIKE 就不用 REGEXP,能用索引就不用全表掃描」原則,在數據驗證、清洗、異構數據遷移等場景發揮最大價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved