MySQL 正則表達(dá)式用法、模式和注意事項(xiàng)詳解
MySQL 正則表達(dá)式詳細(xì)說明
MySQL 支持正則表達(dá)式(Regular Expression),用于在查詢中進(jìn)行復(fù)雜的模式匹配。它主要通過 REGEXP
或 RLIKE
操作符實(shí)現(xiàn)(兩者功能相同),以及 MySQL 8.0 及以上版本提供的擴(kuò)展函數(shù)。以下內(nèi)容將逐步解釋其用法、模式和注意事項(xiàng)。
1.基本操作符:REGEXP 和 RLIKE
REGEXP
和RLIKE
是等價(jià)的,用于在WHERE
子句中匹配字符串模式。- 語法示例:
SELECT * FROM 表名 WHERE 列名 REGEXP '模式';
- 如果匹配成功,返回
1
(真);否則返回0
(假)。 - 示例:查詢所有以 "a" 開頭的用戶名。
SELECT * FROM users WHERE username REGEXP '^a';
2.常用正則表達(dá)式模式
MySQL 正則表達(dá)式基于 POSIX 擴(kuò)展正則表達(dá)式(ERE)標(biāo)準(zhǔn)。以下是常見元字符和模式:
- 基本匹配:
.
:匹配任意單個(gè)字符(除換行符外),例如'a.c'
匹配 "abc" 或 "aac"。^
:匹配字符串開頭,例如'^start'
匹配以 "start" 開頭的字符串。$
:匹配字符串結(jié)尾,例如'end$'
匹配以 "end" 結(jié)尾的字符串。
- 字符類:
[abc]
:匹配 "a"、"b" 或 "c" 中的任意一個(gè)字符。[^abc]
:匹配除 "a"、"b"、"c" 外的任意字符。[a-z]
:匹配任意小寫字母。
- 量詞(控制匹配次數(shù)):
*
:匹配前一個(gè)元素零次或多次,例如'ab*c'
匹配 "ac"、"abc"、"abbc" 等。+
:匹配前一個(gè)元素一次或多次,例如'ab+c'
匹配 "abc"、"abbc",但不匹配 "ac"。?
:匹配前一個(gè)元素零次或一次,例如'ab?c'
匹配 "ac" 或 "abc"。{n}
:匹配前一個(gè)元素恰好 $n$ 次,例如'a{3}'
匹配 "aaa"。{n,}
:匹配前一個(gè)元素至少 $n$ 次,例如'a{2,}'
匹配 "aa"、"aaa" 等。{n,m}
:匹配前一個(gè)元素 $n$ 到 $m$ 次,例如'a{2,4}'
匹配 "aa"、"aaa" 或 "aaaa"。
- 分組和或操作:
|
:表示“或”,例如'apple|banana'
匹配 "apple" 或 "banana"。()
:用于分組,例如'(ab)+'
匹配 "ab"、"abab" 等。
- 轉(zhuǎn)義字符:
- 使用
\\
轉(zhuǎn)義特殊字符,例如'\\.'
匹配字面點(diǎn)號(hào) "."。
- 使用
3.MySQL 正則表達(dá)式函數(shù)(MySQL 8.0+)
從 MySQL 8.0 開始,引入了更強(qiáng)大的函數(shù):
- REGEXP_LIKE():檢查是否匹配模式,語法
REGEXP_LIKE(字符串, '模式')
。SELECT REGEXP_LIKE('hello', '^h') AS result; -- 返回 1
- REGEXP_INSTR():返回匹配子串的起始位置,語法
REGEXP_INSTR(字符串, '模式')
。SELECT REGEXP_INSTR('abc123', '[0-9]+') AS position; -- 返回 4(數(shù)字起始位置)
- REGEXP_SUBSTR():提取匹配的子串,語法
REGEXP_SUBSTR(字符串, '模式')
。SELECT REGEXP_SUBSTR('email: test@example.com', '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}') AS email; -- 返回 "test@example.com"
- REGEXP_REPLACE():替換匹配的子串,語法
REGEXP_REPLACE(字符串, '模式', '替換文本')
。SELECT REGEXP_REPLACE('Phone: 123-456', '[0-9]{3}-[0-9]{3}', '***-***') AS masked; -- 返回 "Phone: ***-***"
4.示例查詢
- 匹配數(shù)字序列:查詢包含至少 3 位數(shù)字的字符串。
SELECT * FROM data WHERE content REGEXP '[0-9]{3,}';
- 驗(yàn)證郵箱格式:檢查是否符合標(biāo)準(zhǔn)郵箱模式。
SELECT * FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
- 提取和替換:在 MySQL 8.0 中,提取日期部分。
SELECT REGEXP_SUBSTR('2023-10-05 event', '[0-9]{4}-[0-9]{2}-[0-9]{2}') AS date; -- 返回 "2023-10-05"
5.注意事項(xiàng)
- 區(qū)分大小寫:MySQL 默認(rèn)不區(qū)分大小寫。如需區(qū)分,使用
BINARY
關(guān)鍵字或REGEXP_LIKE
的選項(xiàng),例如REGEXP_LIKE(str, 'pattern', 'c')
('c' 表示大小寫敏感)。 - 性能影響:正則表達(dá)式比簡單
LIKE
查詢更慢,避免在大表上頻繁使用。優(yōu)先考慮索引或全文搜索。 - 版本兼容性:
REGEXP
/RLIKE
支持所有 MySQL 版本。- 高級(jí)函數(shù)(如
REGEXP_REPLACE
)僅限 MySQL 8.0+。 - 舊版本(如 MySQL 5.7)可能不支持某些模式(如 Unicode 字符類)。
- 轉(zhuǎn)義規(guī)則:在 SQL 字符串中,需雙重轉(zhuǎn)義特殊字符。例如,匹配點(diǎn)號(hào)使用
'\\.'
,而非單反斜杠。 - 錯(cuò)誤處理:無效模式會(huì)導(dǎo)致查詢錯(cuò)誤。測試模式前,可使用簡單值驗(yàn)證。
6.總結(jié)
MySQL 正則表達(dá)式提供靈活的文本匹配能力,適用于數(shù)據(jù)驗(yàn)證、清洗和提取。核心操作符 REGEXP
適用于基礎(chǔ)匹配,而 MySQL 8.0+ 的函數(shù)擴(kuò)展了功能。使用時(shí),注意模式語法、性能優(yōu)化和版本限制。推薦先在小型數(shù)據(jù)集上測試模式,再應(yīng)用到生產(chǎn)環(huán)境。
到此這篇關(guān)于MySQL 正則表達(dá)式用法、模式和注意事項(xiàng)詳解的文章就介紹到這了,更多相關(guān)mysql 正則表達(dá)式說明內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL ClickHouse常用表引擎超詳細(xì)講解
這篇文章主要介紹了MySQL ClickHouse常用表引擎,ClickHouse表引擎中,CollapsingMergeTree和VersionedCollapsingMergeTree都能通過標(biāo)記位按規(guī)則折疊數(shù)據(jù),從而達(dá)到更新和刪除的效果2022-11-11MySQL 配置優(yōu)化(多個(gè)參數(shù))
安裝MySQL后,配置文件my.cnf在 /MySQL安裝目錄/share/mysql目錄中,該目錄中還包含多個(gè)配置文件可供參考,有my-large.cnf ,my-huge.cnf, my-medium.cnf,my-small.cnf,分別對(duì)應(yīng)大中小型數(shù)據(jù)庫應(yīng)用的配置。win環(huán)境下即存在于MySQL安裝目錄中的.ini文件2016-05-05CentOS下將MySQL 5.1升級(jí)到MySQL 5.5的步驟
這篇文章主要介紹了CentOS下將MySQL 5.1升級(jí)到MySQL 5.5的步驟,需要的朋友可以參考下2015-08-08mysql的數(shù)據(jù)壓縮性能對(duì)比詳情
這篇文章主要介紹了mysql的數(shù)據(jù)壓縮性能對(duì)比,今天對(duì)這兩種方式分別進(jìn)行了測試,對(duì)比了二者在磁盤占用以及查詢性能方面各自的優(yōu)劣,下面我們大家一起進(jìn)入文章了解詳細(xì)內(nèi)容,需要的朋友也可以參考一下2021-11-11