第9章 用正則表達式搜索
1、正則表達式介紹
正則表達式是用來匹配某種文本模式的特殊字符串(字符集合),由正則表達式語言建立。
正則表達式語言有自己的語法和指令,所有種類的程序、操作系統都支持正則表達式語言。
正則表達式能做什么?能應付更復雜的文本匹配過濾。
例如:從文本中提取電話號碼;從文本中提取重復單詞;從文件內容中替換url鏈接;找到文件名中有數字的文件。
2、mysql也支持正則表達式匹配
2.1基本字符匹配
找到產品名包含'1000'的產品,并按名稱排序:select prod_name from products where prod_name regexp '1000' order by prod_name;
(regexp ‘1000’ 用LIKE加通配符也能實現:like ?'%1000%')
找到產品名包含'x000'的產品,并按名稱排序,x代表任意字符:select prod_name from products where prod_name regexp '.000' order by prod_name; 注意:'.000'中的(.)在正則表達式中代表任意字符。
找到產品名包含'JetPack'的產品,并按名稱排序,
select prod_name from products where prod_name regexp 'Jetpack' order by prod_name;(不區分大小寫)
如果要區分大小寫,需在regexp后加binary關鍵字:
select prod_name from products where prod_name regexp binary 'Jetpack' order by prod_name;
select prod_name from products where prod_name regexp?binary?'JetPack' order by prod_name;
2、進行OR匹配
正則表達式的or操作符格式為 (|)。
找出名稱包含1000、2000或3000的產品,并按名稱排序:select prod_name from products where prod_name regexp '1000|2000|3000' order by prod_name;
3、匹配一組字符之一,實質是or的另一種形式, '[123] Ton' ='[1|2|3] Ton'。
找到名稱包含1 Ton、2 Ton或3 Ton的產品,并按名稱排序:
select prod_name from products where prod_name regexp '[123] Ton' order by prod_name;
select prod_name from products where prod_name regexp '[1|2|3] Ton' order by prod_name;
select prod_name from products where prod_name regexp '1|2|3 Ton' order by prod_name;
因沒加[中括號],此處'1|2|3 Ton'等同于1、2、或3 Ton,所以查詢結果錯誤。
4、匹配范圍
集合匹配,0123456=[0-6],abcdefg=[a-g]
找到名稱包含1 Ton、2 Ton、5 Ton 的產品:select prod_name from products where prod_name regexp '[1-5] Ton' order by prod_name;
5、匹配特殊字符
特殊字符:指在正則表達式語言中,有特殊意義的字符,如: . 、%、|、[、]、-、\ 等。
要匹配特殊字符,要用左雙斜線 “\\” 做轉義,如:\\.、\\-、\\%、\\\ 等。
還有一些系統的元字符,也需要轉義才能匹配到,如:分頁\\f 、換行\\n、回車\\r、制表符\\t、縱向制表符\\v。
找出名稱中帶.的供應商:select vend_name from vendors where vend_name regexp '\\.' order by vend_name;
6、匹配字符類
字符類:指正則語言中,預定義的一類字符,如:
[:alnum:]任意字母或數字(同[a-zA-Z0-9]);
[:alpha:]任意字母(同[a-zA-Z]);
[:digit:]任意數字(同[0-9]);
[:upper:]任意大寫字母(同[A-Z]);
[:lower:]任意小寫字母(同[a-z]);
[:blank:]空格和制表符(同[\\t]);
[:space:]任意空格和任意空白字符(同[\\f\\n\\r\\t]]v])。
7、匹配重復模式
前面的匹配都是唯一值匹配,有時還要匹配有重復的字符或字符類,如:至少包含一個數字。
此時需要用,重復元字符,如:
* ? ? ? ?0或任意多個匹配
+ ? ? ? 1或任意多個匹配
? ? ? ? 0或1個匹配
{n}
{n,}
{n,m}
找到名稱包含'(任意一位數字加sticks或stickss)'的產品,:select prod_name from products where prod_name regexp '\\([0-9] sticks?\\)';
找到名稱包含連續4位數字的產品:select prod_name from products where prod_name regexp '[[:digit:]]{4}' order by prod_name;(注意:'[[:digit:]]{4}'也可寫成'[0-9][0-9][0-9][0-9]')
8、定位符
定位符,是為了匹配特定位置的文本。定位符元字符:
^文本的開始
$文本的結尾
[[:<:]]詞的開始
[[:>:]]詞的結尾
找出名稱以一位數字或小數點開頭的產品:select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name;
注意:^的兩種用法:
在集合中表示否,如[^0-5]表示非0-5的一位數字;
在集合外表示開始定位符,如^[0-5]表示以0-5開始的一位數字。
9、正則表達式簡單測試:
用select測試正則表達式,將返回值0或1,如:select 'hello'? regexp '[0-9]';(因為hello中不含數字,故返回值0。)
《mysql必知必會》是一本好書,是一本sql語言入門書,豆瓣評分很高。
作者是英國的Ben Forta,世界知名的技術作家,由人民郵電出版社發行,我覺得原作名: MySQL Crash Course,直譯為:《MYSQL速成》更具暢銷書潛質,只是比較俗吧,呵呵。
書中從介紹簡單的數據檢索開始,逐步深入一些復雜的內容,包括聯結的使用、子查詢、正則表達式和基于全文本的搜索、存儲過程、游標、觸發器、表約束,等等。
前三章是基礎概念,講了SQL和數據庫的基本概念,Mysql數據庫的概念和使用方法,第四章開始SQL實操練習,這里是本書的一些實操練習筆記,有興趣的話可以按這個練習幾遍,相信對新手會很有幫助,讓你不經意間功力大增。