MYSQL中REGEXP的實(shí)現(xiàn)示例
MySQL 的 REGEXP 函數(shù)是處理復(fù)雜字符串匹配的 “瑞士軍刀”,掌握它能大幅提升數(shù)據(jù)篩選效率。
一、基礎(chǔ)掃盲:先搞懂 “是什么”
1. 什么是正則表達(dá)式?
用一句話解釋:正則表達(dá)式是一套用于描述字符串模式的規(guī)則,通過特殊符號(元字符)定義匹配邏輯,比如 “匹配以字母開頭、數(shù)字結(jié)尾的字符串”。
2. MySQL 中 REGEXP 的用法
- 基礎(chǔ)語法:
column REGEXP 'pattern'(返回 1 表示匹配,0 表示不匹配)。 - 舉例:
SELECT * FROM users WHERE email REGEXP '@gmail\\.com$';(匹配 gmail 郵箱,注意.需要轉(zhuǎn)義)。 - 與 LIKE 的核心區(qū)別:
| 特性 | LIKE | REGEXP |
|---|---|---|
| 匹配方式 | 僅支持%(任意字符)和_(單個字符) | 支持元字符(^、$、*等),功能更靈活 |
| 部分匹配 | 需用%pattern%實(shí)現(xiàn) | 默認(rèn)就是部分匹配(無需通配符) |
| 轉(zhuǎn)義符 | 依賴數(shù)據(jù)庫設(shè)置 | 統(tǒng)一用\\轉(zhuǎn)義(如\\.匹配小數(shù)點(diǎn)) |
三、核心語法:元字符與示例(重中之重)
| 元字符 | 作用 | MySQL 示例(匹配目標(biāo)) |
|---|---|---|
| ^ | 匹配字符串開頭 | '^abc' → 匹配 “abc123”“abcdef” |
| $ | 匹配字符串結(jié)尾 | 'xyz$' → 匹配 “123xyz”“xxyz” |
| . | 匹配任意單個字符(除換行) | 'a.c' → 匹配 “abc”“a1c”“a#c” |
| * | 匹配前一個字符 0 次或多次 | 'ab*c' → 匹配 “ac”“abc”“abbbbc” |
| + | 匹配前一個字符 1 次或多次 | 'ab+c' → 匹配 “abc”“abbbbc”(不匹配 “ac”) |
| ? | 匹配前一個字符 0 次或 1 次 | 'ab?c' → 匹配 “ac”“abc”(不匹配 “abbc”) |
| [ ] | 匹配括號內(nèi)任意單個字符 | '[0-9]' → 匹配任意數(shù)字;'[a-zA-Z]'匹配字母 |
| [^ ] | 匹配不在括號內(nèi)的任意字符 | '[^0-9]' → 匹配非數(shù)字字符 |
| {n} | 匹配前一個字符恰好 n 次 | 'a{3}' → 匹配 “aaa” |
| {n,} | 匹配前一個字符至少 n 次 | 'a{2,}' → 匹配 “aa”“aaa” 等 |
| {n,m} | 匹配前一個字符 n 到 m 次 | 'a{1,3}' → 匹配 “a”“aa”“aaa” |
注意:MySQL 的 REGEXP 默認(rèn)不區(qū)分大小寫,若需區(qū)分,可使用REGEXP BINARY,例如'abc' REGEXP BINARY 'ABC'返回 0(不匹配)。
四、實(shí)戰(zhàn)案例:用 REGEXP 解決實(shí)際問題
這部分是博客的 “靈魂”,結(jié)合具體場景展示用法,讀者可直接復(fù)用:
1. 驗(yàn)證格式合法性
匹配手機(jī)號(以 1 開頭,11 位數(shù)字):
SELECT * FROM user WHERE phone REGEXP '^1[3-9][0-9]{9}$';匹配郵箱(含 @和域名后綴):
SELECT * FROM user WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';2. 篩選包含特定模式的字符串
提取包含數(shù)字的用戶名:
SELECT username FROM user WHERE username REGEXP '[0-9]';
排除包含特殊字符(如!、@)的記錄:
SELECT * FROM user WHERE username NOT REGEXP '[!@#$%]';
3. 替換或清洗數(shù)據(jù)(結(jié)合 REGEXP_REPLACE)
MySQL 8.0 及以上支持REGEXP_REPLACE,例如清除字符串中的所有空格:
SELECT REGEXP_REPLACE(address, ' ', '') AS clean_address FROM user;
五、避坑指南:這些 “坑” 別踩
- 轉(zhuǎn)義符的坑:MySQL 中需用
\\轉(zhuǎn)義(而非標(biāo)準(zhǔn)正則的\),例如匹配小數(shù)點(diǎn)需寫\\.,否則.會被解釋為 “任意字符”。 - 性能問題:REGEXP 匹配會全表掃描(無法使用索引),避免在大數(shù)據(jù)量表中用復(fù)雜正則,可先通過 WHERE 條件縮小范圍。
- 版本差異:低版本 MySQL(如 5.7)不支持
{n,m}、?等元字符,需用*或+替代;MySQL 8.0 新增對正則捕獲組的支持(REGEXP_SUBSTR)。 - 部分匹配的 “陷阱”:
column REGEXP 'abc'會匹配 “abc”“xabc”“abcx”,若需精確匹配整個字符串,需加^和$(如'^abc$')。
六、進(jìn)階:REGEXP 與其他函數(shù)結(jié)合
- REGEXP_INSTR:返回匹配內(nèi)容在字符串中的位置,例如
REGEXP_INSTR('abc123', '[0-9]')返回 4(第一個數(shù)字的位置)。 - REGEXP_SUBSTR:提取匹配的子串,例如
REGEXP_SUBSTR('電話:13800138000', '[0-9]{11}')返回 “13800138000”。
七、總結(jié):REGEXP 學(xué)習(xí)路徑
- 記住常用元字符(
^$.*[]是基礎(chǔ)); - 先在測試庫用簡單案例練習(xí)(如匹配數(shù)字、字母);
- 復(fù)雜場景分步驟拆解(如郵箱驗(yàn)證可拆分為 “用戶名 +@+ 域名 + 后綴”);
- 善用 MySQL 官方文檔(點(diǎn)擊查看)查詢版本特性。
一句話收尾:REGEXP 是 MySQL 字符串處理的 “進(jìn)階技能”,看似復(fù)雜,實(shí)則掌握規(guī)律后能大幅提升效率 —— 從今天開始,告別繁瑣的 LIKE 嵌套吧!
到此這篇關(guān)于MYSQL中REGEXP的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MYSQL REGEXP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL中REGEXP正則表達(dá)式使用大全
- MySQL中使用replace、regexp進(jìn)行正則表達(dá)式替換的用法分析
- mysql數(shù)據(jù)庫replace、regexp的用法
- Mysql中正則表達(dá)式Regexp常見用法
- 老生常談MYSQL模式匹配 REGEXP和like的用法
- mysql模糊查詢like和regexp小結(jié)
- mysql模糊查詢like與REGEXP的使用詳細(xì)介紹
- MySQL正則表達(dá)式REGEXP使用詳解
- MySQL regexp 命令詳解
- MySql比較運(yùn)算符正則式匹配REGEXP的詳細(xì)使用詳解
- Mysql中正則表達(dá)式Regexp常見用法及說明
相關(guān)文章
Linux搭建單機(jī)MySQL8.0.26版本的操作方法
這篇文章主要介紹了Linux搭建單機(jī)MySQL8.0.26版本的操作方法,本文通過圖文并茂的形式給大家講解的非常詳細(xì),感興趣的朋友一起看看吧2025-05-05
MySQL深度分頁(千萬級數(shù)據(jù)量如何快速分頁)
后端開發(fā)中經(jīng)常需要分頁展示,個時候就需要用到MySQL的LIMIT關(guān)鍵字。LIMIT在數(shù)據(jù)量大的時候極可能造成的一個問題就是深度分頁。本文就介紹一下解決方法,感興趣的可以了解一下2021-07-07
MySQL數(shù)據(jù)庫innodb啟動失敗無法重啟的解決方法
這篇文章給大家分享了MySQL數(shù)據(jù)庫innodb啟動失敗無法重啟的解決方法,通過總結(jié)自己遇到的問題分享給大家,讓遇到同樣問題的朋友們可以盡快解決,下面來一起看看吧。2016-09-09
MySQL系列關(guān)于NUll值的經(jīng)驗(yàn)總結(jié)分析教程
這篇文章主要為大家介紹了MySQL系列關(guān)于NUll值的一些經(jīng)驗(yàn)總結(jié)分析,關(guān)于null值的影響作用以及為什么會出現(xiàn)null值的原因等等問題的解析2021-10-10
使用phpMyAdmin批量修改Mysql數(shù)據(jù)表前綴的方法
這篇文章主要介紹了使用phpMyAdmin批量修改Mysql數(shù)據(jù)表前綴的方法,需要的朋友可以參考下2015-09-09

