MySQL中正則表達(dá)式(REGEXP)使用詳解
前言
有時候使用MySQL進(jìn)行數(shù)據(jù)庫查詢數(shù)據(jù)的時候,like查詢存在局限性,這時候就可以使用MySQL中的正則表達(dá)式查詢的方式。
正則表達(dá)式是用來匹配文本的特殊的串(字符集合),將一個模式(正則表達(dá)式)與一個文本串進(jìn)行比較。
- 從文本文件中提取電話號碼
- 查找名字中間帶有數(shù)字的文件
- 文本塊中重復(fù)出現(xiàn)的單詞
- 替換頁面的URL為這些URL的實際鏈接(一個或兩個正則表達(dá)式)
LIKE和REGEXP的區(qū)別
LIKE匹配整個列(like是模糊查詢),如果被匹配的文本僅在列值中出現(xiàn),LIKE并不會找到它,相應(yīng)的行也不會返回(當(dāng)然,使用通配符除外)
REGEXP在列值內(nèi)進(jìn)行匹配,如果被匹配的匹配的文本在列值中出現(xiàn),REGEXP將會找到它,相應(yīng)的行將被返回,這時一個非常重要的差別(當(dāng)然,如果適應(yīng)定位符號^和$,可以實現(xiàn)REGEXP匹配整個列而不是列的子集)
例如:
查詢一個表name列含有chen字符串的數(shù)據(jù),兩條sql語句如下
select * from stu_info where name like '小白'; select * from stu_info where name regexp '小白';
第一條的查詢結(jié)果是name值等于’小白‘的數(shù)據(jù),而第二條的查詢結(jié)果是name中包含’小白’的數(shù)據(jù),也可以用like(模糊查詢+通配符)來實現(xiàn)regexp查詢結(jié)果。
OR進(jìn)行匹配
select column from table where column regexp 'X|Y' order by column; select column from table where column regexp '[XY]test' order by column;
第一種寫法會將|應(yīng)用于整個串,只要字符串中有X或Y的數(shù)據(jù),都將被檢索出來
第二種寫法只將[XY]應(yīng)用于搜索模式的開頭處
匹配范圍
([])集合可以用來定義要匹配的一個或多個字符,比如[0123456789],為了簡化這種類型的集合,可使用(-)來定義一個范圍,即[0-9],[a-z]
匹配特殊字符
則表達(dá)式由具有特定含義的特殊字符構(gòu)成;如果要匹配這些特殊字符,就需要用\為前導(dǎo),這種處理方式就是所謂的轉(zhuǎn)義(escaping),正則表達(dá)式內(nèi)具有特殊意義的所有字符都必須以這種方式轉(zhuǎn)義;(為了匹配反斜杠{}字符本身,需要使用\\)
注意:多數(shù)正則表達(dá)式實現(xiàn)使用單個反斜杠轉(zhuǎn)義特殊字符,以便能夠使用這些字符本身,而MySQL要求兩個反斜杠(MySQL自己解釋一個,正則表達(dá)式庫解釋一個)
匹配字符類
有時候需要檢索出我們需要的數(shù)字、所有字母字符或所有數(shù)字字母字符等的匹配,我們可以使用預(yù)定義的字符集,稱為字符類。
匹配多個實例
有時候需要對匹配的數(shù)目進(jìn)行更強(qiáng)的控制,比如:尋找所有的數(shù),不管數(shù)中包含多少數(shù)字,或?qū)ふ乙粋€單詞并尾隨一個s(如果存在)等情況,我們可以利用正則表達(dá)式中的重復(fù)元字符來完成。
select column from table where column regexp '\\([0-9] sticks?\\)' order by column;
上面的正則表達(dá)式‘\([0-9] sticks?\)’意為:\匹配([0-9]匹配任意數(shù)字,這里指匹配的數(shù)值范圍,sticks?匹配stick和sticks{?使s可選,因為?匹配它前面任何字符的0或者1次出現(xiàn)})。
定位符
有時候為了匹配特定位置的文本,需要使用定位符,常用定位符列表如下:
找出一個以一個數(shù)(包括小數(shù)點開始的數(shù))開始的所有數(shù)值,簡單搜索[0-9\.]或([[:digit:]\.])不行,因為它將在文本內(nèi)任意位置查找匹配,可以使用^定位符,如下:
select column from table where column regexp '^[0-9\\.]' order by column;
^有兩種用法
- 在集合中(用[和]定義),用它來否定該集合
- 用來指串的開始處
使regexp和like起相同作用:like匹配整串二regexp匹配子串,可以利用定位符,用^開始每個表達(dá)式,用$結(jié)束每個表達(dá)式,就可以使regexp和like作用一樣。
查詢admin表中的group字段,數(shù)據(jù)格式為:1,2,3;4,5,6;1,87,101
例如查詢101:
select * from xin_admin where `group` REGEXP '[,|;]?101[,|;]?';
附:Mysql字符串截取 和 截取字符進(jìn)行查詢
一、MySQL中字符串的截取
MySQL中有專門的字符串截取函數(shù):其中常用的有兩種:substring_index(str,delim,count) 和concat
1.substring_index(str,delim,count) 函數(shù)的使用較為普遍。
函數(shù)括號里面的依次為:要分隔截取的字符串(如:”aaa_bbb_ccc”)、分隔符(如:“_”)、位置(表示第幾個分隔符處,如:“1”)。
- count為正數(shù),那么就是從左邊開始數(shù),函數(shù)返回第count個分隔符的左側(cè)的字符串;
- count為負(fù)數(shù),那么就是從右邊開始數(shù),函數(shù)返回第count個分隔符右邊的所有內(nèi)容;
- count可以為0,返回為空。
例子:substring_index("aaa_bbb_ccc","_",1) ,返回為 aaa;
substring_index("aaa_bbb_ccc","_",2) ,返回為 aaa_bbb;
substring_index(substring_index("aaa_bbb_ccc","_",-2),"_",1) ,返回為 bbb;
2.concat是連接幾個字符串
例子:concat(‘m’,’y’,’s’,’q’,’l’);
返回:mysql
二、依據(jù)表中的某個字段查詢包含有這個字符的所有數(shù)據(jù)
1.find_in_set:SELECT * FROM user WHERE find_in_set(‘吳’,name);
查詢user表中所有name包含“吳”的數(shù)據(jù)
2.REGEXP:SELECT * FROM user WHERE name REGEXP ‘(‘吳’|‘劉’)’;
使用正則,查詢包含劉或者吳的數(shù)據(jù)
總結(jié)
到此這篇關(guān)于MySQL中正則表達(dá)式(REGEXP)使用的文章就介紹到這了,更多相關(guān)MySQL正則表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C++實現(xiàn)Mysql數(shù)據(jù)庫連接池實例
數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理、和釋放數(shù)據(jù)庫連接,允許使用應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接。數(shù)據(jù)庫連接是關(guān)鍵有限且昂貴的資源,一個數(shù)據(jù)庫連接對象均對應(yīng)一個物理數(shù)據(jù)庫的連接,每次操作都打開一個物理連接,使用完都關(guān)閉連接2022-12-12MySQL追蹤數(shù)據(jù)庫表更新操作來源的全面指南
本文將以一個具體問題為例,如何監(jiān)測哪個IP來源對數(shù)據(jù)庫表?statistics_test?進(jìn)行了UPDATE操作,文內(nèi)探討了多種方法,并提供了詳細(xì)的代碼示例,需要的可以了解下2025-06-06在CMD中操作mysql數(shù)據(jù)庫出現(xiàn)中文亂碼解決方案
有說將cmd字符編碼用chcp命令改為65001(utf8字符編碼),可這樣之后根本無法輸入中文,查詢出的中問結(jié)果依舊亂碼 。下面小編給大家?guī)砹嗽贑MD中操作mysql數(shù)據(jù)庫出現(xiàn)中文亂碼解決方案,一起看看吧2017-09-09MySQL的InnoDB存儲引擎的數(shù)據(jù)頁結(jié)構(gòu)詳解
這篇文章主要為大家詳細(xì)介紹了MySQL的InnoDB存儲引擎的數(shù)據(jù)頁結(jié)構(gòu),,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03linux系統(tǒng)ubuntu18.04安裝mysql 5.7
這篇文章主要為大家詳細(xì)介紹了linux系統(tǒng)ubuntu18.04安裝mysql 5.7,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09