程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql正則REGEXP學習練習筆記

mysql正則REGEXP學習練習筆記

編輯:MySQL綜合教程

REGEXP在mysql是用來執行正則表達式的一個函數,像php中的preg之類的函數了,regexp正則函數如果只是簡單的查詢使用like即可,但復雜的還是需要使用regexp了,下面我們來看看。

MySql用戶手冊建議,在構造簡單查詢時,仍使用通配符。


如:Select [*|fieldname list] From [tablename] where [fieldname] like ["%someletter"|"%someletter%","_","?someletter"];

但在一些特殊查詢中,不用正則表達式是不行的。MYSQL提供的正則表達式WHERE謂詞有三個,分別是:
REGEXP, RLIKE, NOT RLIKE
用這三個替換原有的LIKE謂詞,後面即可以跟正則表達式。

例如要查詢字段中含有“_”的數據,則要用以下查詢語句:

SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';

擴展正則表達式的一些字符是:

· ‘.’匹配任何單個的字符。

· 字符類“[...]”匹配在方括號內的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。為了命名字符的范圍,使用一個“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何數字。

· “ * ”匹配零個或多個在它前面的字符。例如,“x*”匹配任何數量的“x”字符,“[0-9]*”匹配任何數量的數字,而“.*”匹配任何數量的任何字符。

如果REGEXP模式與被測試值的任何地方匹配,模式就匹配(這不同於LIKE模式匹配,只有與整個值匹配,模式才匹配)。
為了定位一個模式以便它必須匹配被測試值的開始或結尾,在模式開始處使用“^”或在模式的結尾用“$”。
為了找出以“b”開頭的名字,使用“^”匹配名字的開始:

使用正則

SELECT * FROM pet WHERE name REGEXP BINARY ‘^b’;
SELECT * FROM pet WHERE name REGEXP ‘fy$’;
SELECT * FROM pet WHERE name REGEXP ‘w’;
SELECT * FROM pet WHERE name REGEXP ‘^…..$’;
SELECT * FROM pet WHERE name REGEXP ‘^.{5}$’;


今天在應用中遇到了這樣的一個問題,
有一個字段 t1,其中的值類似於:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2

需要從裡面搜索出比如說:第一個逗號前的數字范圍為3-5之間,第三個逗號前的數字的范圍為3-5之間,第10個逗號前的數字范圍為3-5之間,其余的都為1-5之間。。。

則sql語句可以這麼寫:

    SELECT * FROM tb WHERE t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';

1. 使用LIKE和NOT LIKE比較操作符(注意不能使用=或!=);

2. 模式默認是忽略大小寫的;

3. 允許使用”_”匹配任何單個字符,”%”匹配任意數目字符(包括零字符);


附一些mysql正則規則

^                         匹配字符串的開始部分

$                         匹配字符串的結束部分

.                          匹配任何字符(包括回車和新行)

a*                       匹配0或多個a字符的任何序列

a+                       匹配1個或多個a字符的任何序列

a?                       匹配0個或1個a字符

de|abc               匹配序列de或abc

(abc)*                匹配序列adc的0個或者多個實例

 

{n}、{m,n}        {n}或{m,n}符號提供了編寫正則表達式的更通用方式,能夠匹配模式的很多前述原子(或“部分”)。m和n均為整數。

a*              可被寫為a{0,}

a+              可被寫為a{1,}

a?              可被寫為a{0,1}

 

[a-dX]                 匹配任何是a,b,c,d或者X的字符,兩個其他字符之間的’-'字符構成一個范圍

[^a-dX]               匹配任何不是a,b,c,d或者X的字符,前面的字符’^'是否定的意思

 

[.characters.]  在括號表達式中(使用[和]),匹配用於校對元素的字符序列,字符為單個字符或新行等字符名

mysql> SELECT ‘~’ REGEXP ‘[[.~.]]’;                                                        -> 1

mysql> SELECT ‘~’ REGEXP ‘[[.tilde.]]’;                                                 -> 1

 

[=character_class=]

在括號表達式中(使用[和]),[=character_class=]表示等同類。它與具有相同校對值的所有字符匹配,包括它本身,

[[=a=]]              等同於[a(+)],[a+],[a{1,}]

 

[:character_class:]

在括號表達式中(使用[和]),[:character_class:]表示與術語類的所有字符匹配的字符類。

標准的類名稱是:

alnum       文字數字字符

alpha        文字字符

blank         空白字符

cntrl          控制字符

digit          數字字符

graph        圖形字符

lower        小寫文字字符

print          圖形或空格字符

punct        標點字符

space        空格、制表符、新行、和回車

upper        大寫文字字符

xdigit        十六進制數字字符

 

[[:<:]], [[:>:]]

這些標記表示word邊界。它們分別與word的開始和結束匹配。word是一系列字字符,其前面和後面均沒有字字符。字符是alnum類中的字母數字字符或下劃線(_)。

mysql> select ‘fang shan zi’ regexp ‘[[:<:]]shan[[:>:]]’;             -> 1

mysql> select ‘fang shan zi’ regexp ‘[[:<:]]fang[[:>:]]’;              -> 1

mysql> select ‘fang shans zi’ regexp ‘[[:<:]]shan[[:>:]]’;           -> 0

 

正則表達式使用特殊字符,應在其前面加上2個反斜槓’'字符

mysql> SELECT ’1+2′ REGEXP ’1+2′;                       -> 0

mysql> SELECT ’1+2′ REGEXP ’1+2′;                      -> 0

mysql> SELECT ’1+2′ REGEXP ’1\+2′;                     -> 1

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved