正規表示式介紹
在資料庫的資料過濾過程中只用where子句和like操作符都是對於已知值進行的
不管是匹配乙個還是多個值,測試大於還是小於已知值,或者檢查某個範圍的值,都是使用已知的值
當然mysql語句也提供了萬用字元百分號(%)和下劃線(_)來匹配多個和單個字元
在檢索名中包含某些文字或字元的字段時確實很有用,但是這種功能也是有代價的
因為萬用字元和搜尋的處理一般要比有些搜尋所花時間要長,而且會使where子句本身過於複雜
這也就是正規表示式變得有用的地方,所有程式語言、文字編輯器、作業系統等都支援正規表示式
正規表示式是用來匹配文字的特殊串,用正規表示式語言來建立,所以這也是你必須所學習的特殊語法和指令
全文閱讀和自己練習嘗試需要大概十五分鐘左右,熟練運用sql語句中還得需要你自己不斷地積累和使用,希望不會浪費讀者寶貴的時間
萬用字元小技巧
雖然萬用字元搜尋處理要比其他搜尋時間所花時間要長,但是在資料量不大的時候還是建議使用的
這裡在講正規表示式之前還是先給出一些使用萬用字元要記住的技巧:
1. 不要過度使用萬用字元。如果其他操作符能達到相同的目的,應該使用其他操作符
2. 除非絕對必要,否則不要把他們用在搜尋模式的開始處。這樣搜尋起來是最慢的
3. 仔細注意萬用字元的位置。如果放錯地方,可能不會返回想要的資料
學習使用正規表示式
我們從乙個簡單的例子開始,下面檢索列name帶文字aba的部分行
這裡我們先提乙個問題,正規表示式和萬用字元匹配區分大小寫嗎?仔細觀察下面檢索的物件,你就知道答案了
這我們看到關鍵字regexp宣告後面的東西作為正規表示式處理,就得到了所有name列包含aba文字的資料,而且你也發現它們是不區分大小寫的
這時候你可能就要問,為什麼要那麼費力使用正規表示式?在剛才的例子中,沒有體現出帶來的好處,還可能降低效能,也確實沒有以下萬用字元的方法簡單
select *
from city
where name like '%aba%'
order by name
limit 10;
接下來,請考慮接下來的這些例子
這裡使用了正規表示式.east。.是正規表示式中的乙個特殊字元,表示匹配任意乙個字元
|是正規表示式的or操作,它表示匹配其中之一,多個or條件可以併入單個正規表示式。
從這裡開始終於開始有屬於正規表示式自己獨有的匹配方式了
這裡大家應該就有些看不懂這有些複雜的正規表示式了,所以接下來介紹所有正規表示式的其他語法
中括號中括號中新增可以匹配的字元,但是本身只能匹配乙個其中乙個字元,比如說[123]就是匹配1、2或3
還可以匹配範圍,為了簡化[123456789]這種過於冗長的集合,可使用-來定義乙個範圍,比如說[1-9]和剛才的集合是一樣的
識別符號^ :有兩個作用,乙個是在集合中表示否定該集合,乙個是作為定位符表示指文字的開始處
[^123] :匹配除了1、2或3這些字元外的其他東西
^a :文字的開頭是a字元
$ :和^相反,這是文字結尾的識別符號
匹配特殊字元
為了匹配特殊字元,必須用\為前導,這種處理就是所謂的轉義,這樣也存在了很多空白元字元
\f:換頁
\n:換行
\r:回車
\t:製表
\v:縱向製表
多數正規表示式都是用單反斜槓轉義,而mysql要求兩個是因為自己解釋乙個,正則表達庫解釋另乙個
匹配字元類
為了方便工作,可以使用預定義的字符集,成為字元類
[:alnum:]:任意字母或者數字
[:alpha:]:任意字元
[:blank:]:空格和製表
[:cntrl:]:ascii控制字元
[:digit:]:任意數字
[:graph:]:與[:print:]相同,但是不包括空格
[:lower:]:任意小寫字母
[:print:]:任意可列印字元
[:punct:]:不在[:alnum:],但又在[:cntrl:]的任意字元
[:space:]:包括空格在內的任意空白字元
[:upper:]:任意大寫字母
[:xdigit:]:任意十六進製制數字
匹配多個例項
目前為止所有的正規表示式都試圖匹配單次出現,但是有時需要對匹配的數目進行更強的控制
*:0個或多個匹配
+:乙個或多個匹配
?:0個或1個匹配
:指定數目的匹配
:不少於指定數目的匹配
:匹配數目的範圍
總結以上基本就是常用到的mysql正規表示式語法了,如果說你還沒有合適的表來做練習,這裡還有乙個簡單的測試方法
select 'hello' regexp '[0-9]'
regexp檢查總是返回0(沒有匹配)或者1(匹配),所以顯然這個語句的答案是返回0
總結下來你會發現,regexp和like的不同在於,like匹配整個串,而regexp匹配子串
正規表示式涉及的範圍是很廣的,本人在自學linux的bash程式設計時也是常常用到它,所以這是你必須掌握的技能
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...
Linux正規表示式 編寫正規表示式
為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...