前面的幾節的過濾例子允許用匹配、比較和通配操作符來尋找數據。對於基本的數據過濾,這樣就足夠了。但是隨著過濾條件的復雜性的增加,where子句本身的復雜性也有必要增加。這也就是正則表達式變得有用的地方。
正則表達式是用來匹配文本中特殊的字符集合。
正則表達式不是自己第一次見,在JAVA/C++ 這些語言中,都有正則表達式,不過他們的用途是一樣的,都是匹配文本中的字符串。可能具體的用法不太一樣,但也差不多。下面將一一進行學習、介紹。
當我們想查找某列中的字符中是否有某個字符時,雖然可以通過前面的博文中介紹的通配符來完成,但是也是可以通過正則表達式來完成的。如下:
select * from student where name regexp '1' order by id;//找出name中含有 字符1的記錄。
從上面的例子中,或許還沒有看到正則表達式所帶來的好處,感覺這個不就是和通配符一樣的麼。有這個感覺是很正常的,因為這個例子確實沒有體現出正則表達式的強大之處。看完下面的介紹你可能慢慢就會感覺正則表達式的強大之處。
為搜索多個字符串時,在正則表達式中使用 | 進行實現。
select * from student where name regexp '123|456';//|為正則表達式的or操作符。它表示匹配其中之一,因此,只要是字符串中含有123或者是456的記錄就返回。
實踐結果截圖如下:
如果你只想匹配特定的字符,應該怎麼辦呢?
解決的方法就是:通過制定一組用 [ 和 ] 括起來的字符來完成即可。
例如,如果你想匹配所有字符串中含有偶數數字的數據時,你只需要用[]將指定的數據放入就可以了,具體如下:
select * from student where name regex '[02468]' order by score;//通過[02468]就可以匹配了
[]是另一種形式的or操作符的語句。事實上,[02468]等價於 0|2|4|6|8
上面的集合[02468]用來匹配多個字符,而[0123456789] 這個集合就是匹配數字0到9;
為簡化這種類型的集合,可以使用-來定義一個范圍。
例如:[0123456789] 就可以寫成 [0-9];
范圍只要是連續的就是合法的,例如[1-3] [7-9] 以及[B-G] 這些集合都是ok的。
正則表達式中由具有特定含義的特殊字符構成,例如 [ ] | . 等等。
當我們想在字符串中匹配這些字符時,應該如何進行匹配呢?
相信學過JAVA 或者是C++ 的都知道,如果想匹配這些特殊的字符, 就應該對其進行轉義,轉義的方法為:在這些特殊的字符前面加上兩個反斜槓,即 \\;例如,\\[ , \\] \\| \\. 等;
下面就以 匹配字符串中的 . 這個特殊符號進行舉例說明。
select * from student where name regexp '\\.';//返回的結果就是含有字符 . 的結果
如果我們不用 \\對點 進行轉義,則因為 點.是用來匹配任意一個字符的,因此,會出現所有的結果,並不是我們想要的。
具體結果如下:
匹配字符類,可以這樣理解,就是為了方便,系統給我們提供了一些簡寫。例如 在JAVA中 使用\\d來匹配任意數字,而在MySQL中 使用[:digit:] 來進行任意數字的匹配。
具體見下面表格(圖片來源於《MySQL必知必會))
目前為止使用的正則表達式都試圖匹配單次出現。即如果存在一個匹配,則該行就被檢索出來,否則就不被檢索出來。
但有時需要對匹配的數目進行更強的控制。例如,當你尋找一個單詞時,也想它能夠找出這個單詞的復數形式(即尾隨的s)。
select * from student where name regexp 'rang?';//匹配name中含有ran或者是帶有後綴g的數據。
更多的關於匹配多個實例的符號如下:
前面介紹的都是任意位置的匹配,但是,有的時候,我們想在特定的位置進行匹配,例如:想匹配字符串的開始處是否是以 點 開始的,而不是匹配字符串中任意位置是否含有點。這就需要定位符。
使用例子說明如下:
select * from student where name regexp '^\\.';//檢查字符串是否以點開始。
注意:^有兩種用法,如下:
在集合中(用[ 和 ]定義的),用它來否定該集合,例如[^01234]:指的就是匹配除了012345其它的字符。 用來指串的開始處。
上面介紹了的東西比較多,相信一下子也比較難以掌握好,但是,提醒大家的是,不要強迫自己去記住這些細節,當我們多幾遍正則表達式 ,這些語法方面的細節就掌握了,即使沒有掌握,當我們需要的時候,查下資料就ok了。反正就我而言,無論是學習java還是其他的語言的時候關於正則表達式這一塊的細節,我是沒有去記的,當需要的時候,我就查下資料然後去寫就好。