MySQL中REGEXP正規表示式使用總結

2021-12-30 04:48:52 字數 4715 閱讀 7135

有天在專案中,需要用到根據列值來匹配資料**問題,如當改列值為數值時,為字串時...通過上網搜尋發現,mysql竟然支援正規表示式,

mysql採用henry spencer的正規表示式實施,其目標是符合posix 1003.2。請參見附錄c:感謝。mysql採用了擴充套件的版本,以支援在sql語句中與regexp操作符一起使用的模式匹配操作。請參見3.3.4.7節,「模式匹配」。

在本附錄中,歸納了在mysql中可用於regexp操作的特殊字元和結構,並給出了一些示例。本附錄未包含可在henry spencer的regex(7)手冊頁面中發現的所有細節。該手冊頁面包含在mysql原始碼分發版中,位於regex目錄下的regex.7檔案中。

正規表示式描述了一組字串。最簡單的正規表示式是不含任何特殊字元的正規表示式。例如,正規表示式hello匹配hello。

非平凡的正規表示式採用了特殊的特定結構,從而使得它們能夠與1個以上的字串匹配。例如,正規表示式hello|word匹配字串hello或字串word。

作為乙個更為複雜的示例,正規表示式b[an]*s匹配下述字串中的任何乙個:bananas,baaaaas,bs,以及以b開始、以s結束、並在其中包含任意數目a或n字元的任何其他字串。

以下是可用於隨regexp操作符的表的模式。

應用示例,查詢使用者表中email格式錯誤的使用者記錄:

[sql] view plain copy

select *   

from users  

where email not regexp '^[a-z0-9._%-]+@[a-z0-9.-]+.[a-z]$'  

mysql資料庫中正規表示式的語法,主要包括各種符號的含義。

(^)字元

匹配字串的開始位置,如「^a」表示以字母a開頭的字串。

[sql] view plain copy

mysql> select '***yyy' regexp '^xx';  

| '***yyy' regexp '^xx' |  

|           1 |  

1 row in set (0.00 sec)  

查詢***yyy字串中是否以xx開頭,結果值為1,表示值為true,滿足條件。

($)字元

匹配字串的結束位置,如「x^」表示以字母x結尾的字串。

(.)字元

這個字元就是英文下的點,它匹配任何乙個字元,包括回車、換行等。

(*)字元

星號匹配0個或多個字元,在它之前必須有內容。如:

[sql] view plain copy

mysql> select '***yyy' regexp 'x*';  

這個sql語句,正則匹配為true。

(+)字元

加號匹配1個或多個字元,在它之前也必須有內容。加號跟星號的用法類似,只是星號允許出現0次,加號則必須至少出現一次。

()字元

問號匹配0次或1次。

例項:現在根據上面的表,可以裝置各種不同型別的sql查詢以滿足要求。在這裡列出一些理解。考慮我們有乙個表為person_tbl和有乙個欄位名為名稱:

查詢找到所有的名字以'st'開頭

[sql] view plain copy

mysql> select name from person_tbl where name regexp '^st';  

查詢找到所有的名字以'ok'結尾

[sql] view plain copy

mysql> select name from person_tbl where name regexp 'ok$';  

查詢找到所有的名字包函'mar'的字串

[sql] view plain copy

mysql> select name from person_tbl where name regexp 'mar';  

查詢找到所有名稱以母音開始和'ok'結束 的

[sql] view plain copy

mysql> select name from person_tbl where name regexp '^[aeiou]|ok$';  

乙個正規表示式中的可以使用以下保留字 

所匹配的字串以後面的字串開頭

[sql] view plain copy

mysql> select "fonfo" regexp "^fo$"; -> 0(表示不匹配)   

mysql> select "fofo" regexp "^fo"; -> 1(表示匹配)  

所匹配的字串以前面的字串結尾

[sql] view plain copy

mysql> select "fono" regexp "^fono$"; -> 1(表示匹配)   

mysql> select "fono" regexp "^fo$"; -> 0(表示不匹配)   

匹配任何字元(包括新行)

[sql] view plain copy

mysql> select "fofo" regexp "^f.*"; -> 1(表示匹配)   

mysql> select "fonfo" regexp "^f.*"; -> 1(表示匹配)   

a*匹配任意多個a(包括空串)

[sql] view plain copy

mysql> select "ban" regexp "^ba*n"; -> 1(表示匹配)   

mysql> select "baaan" regexp "^ba*n"; -> 1(表示匹配)   

mysql> select "bn" regexp "^ba*n"; -> 1(表示匹配)  

a+匹配任意多個a(不包括空串)

[sql] view plain copy

mysql> select "ban" regexp "^ba+n"; -> 1(表示匹配)   

mysql> select "bn" regexp "^ba+n"; -> 0(表示不匹配)   

a匹配乙個或零個a

[sql] view plain copy

mysql> select "bn" regexp "^ban"; -> 1(表示匹配)   

mysql> select "ban" regexp "^ban"; -> 1(表示匹配)   

mysql> select "baan" regexp "^ban"; -> 0(表示不匹配)  

de|abc

匹配de或abc

[sql] view plain copy

mysql> select "pi" regexp "pi|apa"; -> 1(表示匹配)   

mysql> select "axe" regexp "pi|apa"; -> 0(表示不匹配)   

mysql> select "apa" regexp "pi|apa"; -> 1(表示匹配)   

mysql> select "apa" regexp "^(pi|apa)$"; -> 1(表示匹配)   

mysql> select "pi" regexp "^(pi|apa)$"; -> 1(表示匹配)   

mysql> select "pix" regexp "^(pi|apa)$"; -> 0(表示不匹配)  

(abc)*

匹配任意多個abc(包括空串)

[sql] view plain copy

mysql> select "pi" regexp "^(pi)*$"; -> 1(表示匹配)   

mysql> select "pip" regexp "^(pi)*$"; -> 0(表示不匹配)   

mysql> select "pipi" regexp "^(pi)*$"; -> 1(表示匹配)   

這是乙個更全面的方法,它可以實現前面好幾種保留字的功能

a*可以寫成a

a+可以寫成a

a可以寫成a

在{}內只有乙個整型引數i,表示字元只能出現i次;在{}內有乙個整型引數i,後面跟乙個「,」,表示字元可以出現i次或i次以上;在{}內只有乙個整型引數i,後面跟乙個「,」,再跟乙個整型引數j,表示字元只能出現i次以上,j次以下(包括i次和j次)。其中的整型引數必須大於等於0,小於等於 re_dup_max(預設是255)。 如果有兩個引數,第二個必須大於等於第乙個

[a-dx]

匹配「a」、「b」、「c」、「d」或「x」

[^a-dx]

匹配除「a」、「b」、「c」、「d」、「x」以外的任何字元。

「[」、「]」必須成對使用

[sql] view plain copy

mysql> select "axbc" regexp "[a-dxyz]"; -> 1(表示匹配)   

mysql> select "axbc" regexp "^[a-dxyz]$"; -> 0(表示不匹配)   

mysql> select "axbc" regexp "^[a-dxyz]+$"; -> 1(表示匹配)   

mysql> select "axbc" regexp "^[^a-dxyz]+$"; -> 0(表示不匹配)   

mysql> select "gheis" regexp "^[^a-dxyz]+$"; -> 1(表示匹配)   

mysql> select "gheisa" regexp "^[^a-dxyz]+$"; -> 0(表示不匹配)  

Mysql中Regexp常見用法

原文 查詢content欄位中包含 車友俱樂部 的記錄 select from club content where content regexp 車友俱樂部 此時的regexp與like的以下用法是等同的 select from club content where content like 車友...

JS正則 RegExp概述

ecmascript通過regexp型別支援正規表示式。格式 let expression pattern flagspattern 模式 flags 標記 說明 所有的元字元在模式中必須轉義 包括 元字元在正規表示式中都有一種或多種特殊功能,所以要匹配上面這些字元本身,就必須使用反斜槓來轉義。示例...

Mysql使用正規表示式 regexp

正規表示式是用某種模式去匹配一類字串的一種方式,其查詢能力要遠在通配字元之上。在mysql中使用regexp關鍵字來匹配查詢正規表示式。demo select from tablename where columnname regexp column 後面用 regexp 加乙個正規表示式。正規表示...