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

MySQL 正則表達式 (REGEXP) 完整使用指南:從入門到進階實戰

     編輯:MySQL 綜合教學

基礎語法與 LIKE 差異

  • SELECT ... WHERE col REGEXP 'pattern'
  • LIKE:匹配整個列值(隱含 ^pattern$)。
  • REGEXP:在列值任意位置匹配模式(類似包含匹配)。
  • 預設不區分大小寫,需區分請用 REGEXP BINARY。

核心元字符與實戰範例

1. 基本字符匹配

-- 匹配以任意字符開頭、後接 000 結尾的產品名
SELECT prod_name FROM Products WHERE prod_name REGEXP '.000';

2. OR 匹配 (|)

-- 匹配含 1000 或 2000 的產品名
SELECT prod_name FROM Products WHERE prod_name REGEXP '1000|2000';

3. 字符集合 []

-- 匹配 1ton、2ton、3ton
SELECT prod_name FROM Products WHERE prod_name REGEXP '[123]ton';

4. 範圍匹配

模式含義
[0-9]任意數字
[a-z]任意小寫字母
[A-Z]任意大寫字母
[^0-9]非數字(^ 在 [] 開頭表示否定)
SELECT prod_name FROM Products WHERE prod_name REGEXP '[0-9]ton';

5. 特殊字符轉義

MySQL 需雙重轉義:\\. 匹配字面點號(標準正則只需 \.)。

SELECT prod_name FROM Products WHERE prod_name REGEXP '\\.000';

6. POSIX 字符類

需外層包 [],如 [[:digit:]]。

類別等價於說明
[:alnum:][a-zA-Z0-9]字母數字
[:alpha:][a-zA-Z]字母
[:digit:][0-9]數字
[:lower:][a-z]小寫
[:upper:][A-Z]大寫
[:space:][\\f\\n\\r\\t\\v]空白字符
[:xdigit:][a-fA-F0-9]十六進制
SELECT * FROM mytable WHERE name REGEXP 'name[[:digit:]]';

7. 量詞(重複匹配)

元字符說明
*0 次或多次
+1 次或多次
?0 次或 1 次
{n}恰好 n 次
{n,}至少 n 次
{n,m}n 到 m 次 (m ≤ 255)
SELECT prod_name FROM Products WHERE prod_name REGEXP '[0-9]{1,3}';

8. 定位符

元字符說明
^字符串開頭(在 [] 外)
$字符串結尾
[[:<:]]單詞開頭
[[:>:]]單詞結尾

注意:^ 在 [] 內表示否定,在外部表示開頭。

效能與最佳實踐

  • 避免全表掃描:REGEXP 無法使用普通 B-Tree 索引(8.0+ 支援函數索引可部分緩解)。大表務必先用 WHERE col LIKE 'prefix%' 過濾再套 REGEXP。
  • 錨定優化:模式以 ^ 開頭可讓優化器嘗試索引範圍掃描。
  • 複雜正則下推:極複雜模式考慮應用層預過濾或使用全文索引 MATCH...AGAINST。
  • 測試工具:使用 SELECT 'test' REGEXP 'pattern' 快速驗證模式,再套用到業務查詢。

版本差異提示

  • MySQL 8.0 引入 REGEXP_REPLACE()、REGEXP_SUBSTR()、REGEXP_INSTR()、REGEXP_LIKE(),兼容 ICU 正則庫,功能大增。
  • 8.0 前使用 Henry Spencer 正則庫,語法子集較小,不支援前瞻/後顧、非貪婪模式等進階特性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved