初识Mysql(part7)--我需要知道的5个关于正则的小知识
學習筆記,以代碼和例子堆砌而成,方便查閱。
參考書籍:《Mysql必知必會》等
要點:REGEXP關(guān)鍵字、BINARY關(guān)鍵字、轉(zhuǎn)義、字符類、正則測試
因為正則表達式筆者專門寫了一系列Blog,所以這里對正則表達式的用法,不做過多闡述,主要看正則在Mysql中的應(yīng)用。
此Blog里的例子都會用下面store數(shù)據(jù)表:
# id, product, price, grade, pro_date, note '1', 'Snob201', '2300.23', 'B', 1998, 'Snob 2000 expand' '2', 'Snob301', '1289.21', 'C', 1996, 'Snob 3000 expand' '3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand' '4', 'GibeX01', '3232.76', 'A', 2000, 'X serise 1' '5', 'GibeX02', '1200.00', 'D', 2000, 'X serise 2' '6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2' '7', 'GibeU300', '3000.78', 'A', 2010, '2.1 X serise 2' '8', 'SnobR001', '6321.54', 'B', 2010, 'R (no.1)' '9', 'SnobR002', '3245.54', 'A', 2011, 'R (no.2)' '10', 'AdroitX001', '6543.90', 'B', 2014, 'Lose' '11', 'AdroitX002', '1050.00', 'D', 2015, 'Lose'注意!Mysql僅支持多數(shù)正則表達式實現(xiàn)的一個很小的子集。
- 關(guān)鍵字LIKE與關(guān)鍵字REGEXP
首先,看下面這行sql語句:
SELECT * from store WHERE product REGEXP '200';輸出:
# id, product, price, grade, pro_date, note '6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2'我們看到拿到了product='GibeU200’的記錄。
現(xiàn)在我想理順REGEXP和LIKE的區(qū)別。
我們把上面的sql語句中的REGEXP替換成LIKE:
SELECT * from store WHERE product LIKE '200';輸出:
# id, product, price, grade, pro_date, note啥都沒匹配到。
這是因為REGEXP將找出product中包含’200’的記錄,而LIKE則要找的是product='200’的記錄。如果LIKE想要匹配部分值(與REGEXP語句相同的效果),則需要使用通配符%或通配符_(%200%)。那么怎樣使REGEXP匹配全部值(與LIKE有相同的效果)呢,這時就要用元字符^和元字符$(^200$)
- 匹配大小寫
首先,來一段代碼:
SELECT * FROM store WHERE product REGEXP 'snob';輸出:
# id, product, price, grade, pro_date, note '1', 'Snob201', '2300.23', 'B', 1998, 'Snob 2000 expand' '2', 'Snob301', '1289.21', 'C', 1996, 'Snob 3000 expand' '3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand' '8', 'SnobR001', '6321.54', 'B', 2010, 'R (no.1)' '9', 'SnobR002', '3245.54', 'A', 2011, 'R (no.2)'可以看到,匹配到了5條記錄,但是這里我們用小寫的’snob’就匹配到了大寫的’Snob’,我不想這樣,我想大寫匹配大寫,小寫匹配小寫,這里可以使用BINARY關(guān)鍵字來實現(xiàn):
SELECT * FROM store WHERE product REGEXP BINARY 'snob';輸出:
# id, product, price, grade, pro_date, note嗯!不錯,這樣小寫的’snob’就啥也匹配不到了。
- 轉(zhuǎn)義
如果我想匹配.可咋整,我們知道.是正則表達式中的元字符,所以我們需要對其進行轉(zhuǎn)義,方法就是在.之前加\\。來個例子先:
SELECT * FROM store WHERE note REGEXP '2\\.0';輸出:
# id, product, price, grade, pro_date, note '3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand' '6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2'多數(shù)正則表達式用\單斜杠就能實現(xiàn)轉(zhuǎn)義的功能,那為啥mysql要用\\雙斜杠呢?這里和python用\\雙斜杠進行轉(zhuǎn)義的原因差不多,詳見:正則表達式的轉(zhuǎn)義。
- 匹配字符類
因為筆者實在懶得打字了,就放圖片吧:
來個字符類的例子:
SELECT * FROM store WHERE note REGEXP '[[:digit:]]{4}';輸出:
# id, product, price, grade, pro_date, note '1', 'Snob201', '2300.23', 'B', 1998, 'Snob 2000 expand' '2', 'Snob301', '1289.21', 'C', 1996, 'Snob 3000 expand' '3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand'再來個字符類例子,加深一下印象唄:
SELECT * FROM store WHERE note REGEXP '^[[:digit:]]\\.[0-9]';輸出:
# id, product, price, grade, pro_date, note '3', 'Snob401', '4876.34', 'A', 2002, '2.0 Snob 3000 expand' '6', 'GibeU200', '5010.12', 'B', 2005, '2.0 X serise 2' '7', 'GibeU300', '3000.78', 'A', 2010, '2.1 X serise 2'- 對正則表達式的簡單測試
可以在不使用數(shù)據(jù)庫的情況下,用SELECT來測試正則表達式,REGEXP檢查將返回0(沒有匹配)或1(匹配),來個例子:
SELECT '應(yīng)用回歸分析第4版' REGEXP '第[1-9]版';輸出:
'1'總結(jié)
以上是生活随笔為你收集整理的初识Mysql(part7)--我需要知道的5个关于正则的小知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四级考试多长时间
- 下一篇: 初识Mysql(part8)--我需要知