首頁 > 軟體

MySQL中正規表示式(REGEXP)使用詳解

2022-07-06 14:05:50

前言

有時候使用MySQL進行資料庫查詢資料的時候,like查詢存在侷限性,這時候就可以使用MySQL中的正規表示式查詢的方式。

正規表示式是用來匹配文字的特殊的串(字元集合),將一個模式(正規表示式)與一個文字串進行比較。

  • 從文字檔案中提取電話號碼
  • 查詢名字中間帶有數位的檔案
  • 文字塊中重複出現的單詞
  • 替換頁面的URL為這些URL的實際連結(一個或兩個正規表示式)

LIKE和REGEXP的區別

LIKE匹配整個列(like是模糊查詢),如果被匹配的文字僅在列值中出現,LIKE並不會找到它,相應的行也不會返回(當然,使用萬用字元除外)
REGEXP在列值內進行匹配,如果被匹配的匹配的文字在列值中出現,REGEXP將會找到它,相應的行將被返回,這時一個非常重要的差別(當然,如果適應定位符號^和$,可以實現REGEXP匹配整個列而不是列的子集)

例如:

查詢一個表name列含有chen字串的資料,兩條sql語句如下

select * from stu_info where name like '小白';
select * from stu_info where name regexp '小白';

第一條的查詢結果是name值等於’小白‘的資料,而第二條的查詢結果是name中包含’小白’的資料,也可以用like(模糊查詢+萬用字元)來實現regexp查詢結果。

OR進行匹配

select column from table where column regexp 'X|Y' order by column;
select column from table where column regexp '[XY]test' order by column;

第一種寫法會將|應用於整個串,只要字串中有X或Y的資料,都將被檢索出來

第二種寫法只將[XY]應用於搜尋模式的開頭處

匹配範圍

([])集合可以用來定義要匹配的一個或多個字元,比如[0123456789],為了簡化這種型別的集合,可使用(-)來定義一個範圍,即[0-9],[a-z]

匹配特殊字元

則表示式由具有特定含義的特殊字元構成;如果要匹配這些特殊字元,就需要用為前導,這種處理方式就是所謂的跳脫(escaping),正規表示式內具有特殊意義的所有字元都必須以這種方式跳脫;(為了匹配反斜槓{}字元本身,需要使用\)

注意:多數正規表示式實現使用單個反斜槓跳脫特殊字元,以便能夠使用這些字元本身,而MySQL要求兩個反斜槓(MySQL自己解釋一個,正規表示式庫解釋一個)

匹配字元類

有時候需要檢索出我們需要的數位、所有字母字元或所有數位字母字元等的匹配,我們可以使用預定義的字元集,稱為字元類。

匹配多個範例

有時候需要對匹配的數目進行更強的控制,比如:尋找所有的數,不管數中包含多少數位,或尋找一個單詞並尾隨一個s(如果存在)等情況,我們可以利用正規表示式中的重複元字元來完成。

select column from table where column regexp '\([0-9] sticks?\)' order by column;

上面的正規表示式‘([0-9] sticks?)’意為:匹配([0-9]匹配任意數位,這裡指匹配的數值範圍,sticks?匹配stick和sticks{?使s可選,因為?匹配它前面任何字元的0或者1次出現})。

定位符

有時候為了匹配特定位置的文字,需要使用定位符,常用定位符列表如下:

找出一個以一個數(包括小數點開始的數)開始的所有數值,簡單搜尋[0-9.]或([[:digit:].])不行,因為它將在文字內任意位置查詢匹配,可以使用^定位符,如下:

select column from table where column regexp '^[0-9\.]' order by column;

^有兩種用法

  • 在集合中(用[和]定義),用它來否定該集合
  • 用來指串的開始處

使regexp和like起相同作用:like匹配整串二regexp匹配子串,可以利用定位符,用^開始每個表示式,用$結束每個表示式,就可以使regexp和like作用一樣。

查詢admin表中的group欄位,資料格式為:1,2,3;4,5,6;1,87,101

例如查詢101:

select * from xin_admin where `group` REGEXP '[,|;]?101[,|;]?';

附:Mysql字串擷取 和 擷取字元進行查詢

一、MySQL中字串的擷取

MySQL中有專門的字串擷取函數:其中常用的有兩種:substring_index(str,delim,count) 和concat

1.substring_index(str,delim,count) 函數的使用較為普遍。

函數括號裡面的依次為:要分隔擷取的字串(如:”aaa_bbb_ccc”)、分隔符(如:“_”)、位置(表示第幾個分隔符處,如:“1”)。

  • count為正數,那麼就是從左邊開始數,函數返回第count個分隔符的左側的字串;
  • count為負數,那麼就是從右邊開始數,函數返回第count個分隔符右邊的所有內容;
  • 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

二、依據表中的某個欄位查詢包含有這個字元的所有資料

1.find_in_set:SELECT * FROM user WHERE find_in_set(‘吳’,name);

查詢user表中所有name包含“吳”的資料

2.REGEXP:SELECT * FROM user WHERE name REGEXP ‘(‘吳’|‘劉’)’;

使用正則,查詢包含劉或者吳的資料

總結

到此這篇關於MySQL中正規表示式(REGEXP)使用的文章就介紹到這了,更多相關MySQL正規表示式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com