上面說了通配符的用法(下劃線 和 % ),但是我們要知道,通配符只能完成最基本的過濾,但是隨着過濾條件的複雜性的增加,我們就需要用到正則表達式啦 。
正則表達式是用來匹配文本的特殊的串(字符集合)。更關鍵的是所有種類的程序語言,文本編輯器,操作系統都支持正則表達式,我們應該學習這種表達文本的方法!
正則表達式是用這則表達式語言來建立的,正則表達式語言是用來完成文本匹配的一種特殊語言,有自己的特殊的語法和指令。
part 1 基本字符匹配
我們從一個例子開始
SELECT users.user_name FROM users WHERE users.user_name REGEXP '黃';
和前面的通配符比較,除了關鍵字 LIKE 被 REGEXP 代替外,並沒有什麼變化。REGEXP後所跟的東西爲正則表達式 。MySQL會將他後面的東西當作正則表達式處理 。
再來看一個例子:
SELECT users.user_name , users.user_age FROM users WHERE users.user_age REGEXP '19.'
’ . ’ 是正則表達式語言中一個特殊字符。它表示匹配任意一個字符,因此,年紀的195 和 196 都能配匹配 。
tip:注意 LIKE 和 REGEXP的區別 ! 有一個重要的差別:LIKE將匹配整個列,如果要匹配的內容是在列的一部分之中,LIKE將不能找到他,行也不會返回(除非使用通配符) ; 但是REGEXP在列內進行匹配 , 如果列內包含他找的文本,相應的行也會被返回。這是一個重要的差別!
part 2 進行 OR 匹配 :
直接看例子吧!
SELECT users.user_name , users.user_age FROM users WHERE users.user_age REGEXP '19|195|199';
如你所見 | 符號 將會產生類似於 SELECT語句中使用OR語句的功能。
part 3 匹配幾個字符之一 :
還是看例子,這裏多說無益 。
SELECT users.user_name , users.user_age FROM users WHERE users.user_age REGEXP '[123]99';
這裏的[123]99 表示 可以匹配 199 299 399 ,[ ]內,是可以匹配的的範圍;但是如果是這樣,[^123]99 就表示是 除了 199 299 399 外的 任何 x99 。
part 4 匹配範圍
我們上面看見了 【】 的作用,就是用來列出一個可匹配內容的,但是如果是 0 - 9 ,難道我們要把 0 1 2 3 4 5 6 7 8 9 都列出來嗎? 所以 , 下面的 寫法也能表示【0123456789】,就是【0-9】。 就是說 - 符號可以用來定義一個範圍 。
例如【1-3】 【3-6】 匹配合法 【a-z】匹配任意字母字符。
part 5 匹配特殊字符
正則表達式語言由具有特定含義的特殊字符構成。我們已經看到 . [] | - 等 。請問,如果我們的文本中要去匹配這些字符,應該怎麼做呢?如何搜索?
在正則表達式中,爲了匹配特殊字符,必須用\爲前導。\- 表示匹配 - ,\ . 表示匹配 . 如果是爲了匹配 \ 就需要 \\ 表示 。
part 6 匹配多個實例
目前爲止,所有的正則表達式都試圖匹配單次出現。就是說,如果存在一個匹配,該行被檢索出來,如果不存在,檢索不出任何行。但有時需要對匹配的數目進行更強的控制,例如,你可能需要尋找所有的數,不管數中包含多少數字,或者可能想尋找一個單詞並且還能適應一個尾隨s(如果存在),等等。
這時候我們就可以使用正則表達式中的重複元字符。
元字符 | 說明 |
---|---|
* | 0個或多個匹配 |
+ | 1個或多個匹配(等於{1,}) |
? | 0個或一個匹配,等於{0,1} |
{n} | 指定數目的匹配 |
{n,} | 不少於指定數目的匹配 |
{n,m} | 匹配數目的範圍(m不超過255) |
看個例子吧!
SELECT name FROM products WHERE name REGEXP '\\( [0-9]sticks? \\)'
將會返回
TNT (1 stick)
TNT (5 sticks)
下面一個例子,我們將匹配一個連在一起的四位數字:
SELECT name FROM prodects WHERE name REGEXP '[0-9]{4}'
將會返回
JetPack 1000
JetPack 2000
part 7 定位符
目前爲止,所有的例子都是匹配一個串中任意位置的文本。爲了匹配特定位置的文本,我們需要使用定位符!
元字符 | 說明 |
---|---|
^ | 文本的開始 |
& | 文本的結尾 |
[[:<:]] | 詞的開始 |
[[:>:]] | 詞的結尾 |
看個例子::
SELECT name FROM products WHERE name REGEXP '^[0-9\\.]'
將會返回
.5
1
2
【0-9\.】就是說 如果是一個 0-9的字符 或者 一個 . 也可以啦。 本例中 ^ 代表了文本的開始,要進行什麼匹配。