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

MySQL 正則表達式 (REGEXP) 語法速查與實戰範例

     編輯:DB2 教學

MySQL REGEXP 核心元字符速查表

元字符含義示例匹配示例
^字符串開始'^L'以 L 開頭的 name
$字符串結束'end$'以 end 結尾
.任意單字符(含換行)'a.c'abc、axc、a\nc
[...]字符集合任一'[a-z0-9]'小寫字母或數字
[^...]排除字符集合'[^0-9]'非數字字符
|或邏輯'cat|dog|fish'cat 或 dog 或 fish
*前字符 0 次或多次'a*c'c、ac、aac、aaac...
+前字符 1 次或多次'a+c'ac、aac、aaac...(至少 1 個 a)
{n}前字符恰好 n 次'ab{3}'abbb
{m,n}前字符 m~n 次'ab{1,3}'ab、abb、abbb
(...)分組'(ab){1,3}'ab、abab、ababab

實戰查詢範例(基於表 info,字段 name)

-- 1. 以 L 開頭
SELECT * FROM info WHERE name REGEXP '^L';

-- 2. 包含 c、e、o 任一字母
SELECT * FROM info WHERE name REGEXP '[ceo]';

-- 3. a 可有可無,後跟 c(即 c 或 ac、aac...)
SELECT * FROM info WHERE name REGEXP 'a*c';

-- 4. b 至少 1 次,最多 3 次(ab、abb、abbb)
SELECT * FROM info WHERE name REGEXP 'ab{1,3}';

-- 5. 字符串 "ab" 整體出現 1~3 次
SELECT * FROM info WHERE name REGEXP '(ab){1,3}';
-- 注意:出現 4 次也會匹配(因為含有 3 次的子串),需用 ^(ab){1,3}$ 精確限制

進階技巧與避坑

1. 邊界錨定:^...$ 精確匹配整串

-- 僅匹配 "ab"、"abab"、"ababab"
SELECT * FROM info WHERE name REGEXP '^(ab){1,3}$';

2. 大小寫敏感性

  • MySQL 8.0+ 默認 utf8mb4_0900_ai_ci **不區分大小寫**
  • 需區分大小寫:REGEXP BINARY '^Abc$' 或 COLLATE utf8mb4_bin

3. 性能考量

  • REGEXP 通常**無法使用索引**,全表掃描
  • 大表建議:WHERE name LIKE 'L%' 替代 REGEXP '^L'
  • 複雜正則考慮應用層預過濾或全文索引

4. REGEXP_REPLACE / REGEXP_SUBSTR (MySQL 8.0+)

-- 提取首個數字串
SELECT REGEXP_SUBSTR('Order-12345-Item', '[0-9]+');  -- 12345

-- 替換所有非數字為空
SELECT REGEXP_REPLACE('Price: $1,234.56', '[^0-9.]', '');  -- 1234.56

總結

MySQL REGEXP 基於 POSIX 1003.2 標準,功能強大但**不走索引**。日常開發掌握 ^ $ . [...] [^...] | * + {m,n} () 核心元字符覆蓋 90% 場景。大表生產環境優先考慮 LIKE、全文索引或應用層預處理,必要時使用 REGEXP 並配合 EXPLAIN 驗證執行計劃。

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