以前我要查找資料都是使用like後來發現mysql中也有正規表示式了並且感覺性能要好於like,下面我來給大家分享一下mysql REGEXP正則表達式使用詳解,希望此方法對大家有幫助。
正規表示式描述了一組字串。最簡單的正規表示式是不含任何特殊字元的正規表示式。例如,正規表示式hello符合hello。
非平凡的正規表示式採用了特殊的特定結構,從而使得它們能夠與1個以上的字串相符。例如,正規表示式hello|word符合字串hello或字串word。
作為一個更為複雜的範例,正規表示式B[an]*s符合下述字串中的任何一個:Bananas,Baaaaas,Bs,以及以B開始、以s結束、並在其中包含任意數目a或n字元的任何其他字串。
以下是可用來隨REGEXP運算子的資料表的模式。
應用程式範例,尋找用戶表中Email格式錯誤的使用者記錄:
SELECT * FROM users WHERE email NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$'
MySQL資料庫中正規表達式的語法,主要包括各種符號的意思。
(^)字元
符合字串的開始位置,如「^a」表示以字母a開頭的字串。
mysql> select 'xxxyyy' regexp '^xx'; +-----------------------+ | 'xxxyyy' regexp '^xx' | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec)
查詢xxxyyy字串中是否以xx開頭,結果值為1,表示值為true,滿足條件。
($)字元
符合字串的結束位置,如「X^」表示以字母X結尾的字串。
(.)字符
這個字符就是英文下的點,它匹配任何一個字符,包括回車、換行等。
(*)字符
星號匹配0個或多個字符,在它之前必須有內容。如:
mysql> select 'xxxyyy' regexp 'x*';
這個SQL語句,正規符合為true。
(+)字元
加號符合1個或多個字符,在它之前也必須有內容。加號跟星號的用法類似,只是星號允許出現0次,加號則必須至少出現一次。
(?)字元
問號符合0次或1次。
實例:
現在根據上面的表,可以裝置各種不同類型的SQL查詢以滿足要求。在這裡列出一些理解。考慮我們有一個表為person_tbl和有一個字段名為名稱:
#查詢找到所有的名字以'st'開頭
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查詢找到所有的名字以'ok'結尾
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查詢找到所有的名字包函'mar'的字串
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查詢找到所有名稱以元音開始和'ok'結束的
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
一個正規表示式中的可以使用以下保留字
^
所符合的字串以後面的字串開頭
mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配) mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配)
##$
所匹配的字串以前面的字串結尾mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配) mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配) .
#
mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配) mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配)
a*
符合任意多個a(包括空白字串)mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配) mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)
a+
符合任意多個a(不包括空白字串)mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配)
a?
#符合一個或零個amysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配) mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)
de|abc
匹配de或abc#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(包括空白字串)
mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配) mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配) mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配)
{1}
{2,3}這是一個更全面的方法,它可以實現前面好幾個保留字的功能
a *可以寫成a{0,}
a+
#可以寫成a{1,}
##a?
可以寫成a{0,1} 在{}內只有一個整數參數i,表示字元只能出現i次;在{}內有一個整數參數i,後面跟一個“, ”,表示字元可以出現i次或i次以上;在{}內只有一個整數參數i,後面跟一個“,”,再跟一個整數參數j,表示字元只能出現i次以上,j次以下(包括i次和j次)。其中的整型參數必須大於等於0,小於等於 RE_DUP_MAX(預設是255)。 如果有兩個參數,第二個必須大於等於第一個
###[^a-dX]######符合除「a」、「b」、「c」、「d」、「X」以外的任何字元。 ######「[」、「]」必須成對使用###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正規表示式使用小結的詳細內容。更多資訊請關注PHP中文網其他相關文章!