MySQL數據庫——用通配符和正則表達式過濾數據(二)

上面說了通配符的用法(下劃線 和 % ),但是我們要知道,通配符只能完成最基本的過濾,但是隨着過濾條件的複雜性的增加,我們就需要用到正則表達式啦 。

正則表達式是用來匹配文本的特殊的串(字符集合)。更關鍵的是所有種類的程序語言,文本編輯器,操作系統都支持正則表達式,我們應該學習這種表達文本的方法!

正則表達式是用這則表達式語言來建立的,正則表達式語言是用來完成文本匹配的一種特殊語言,有自己的特殊的語法和指令。

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的字符 或者 一個 . 也可以啦。 本例中 ^ 代表了文本的開始,要進行什麼匹配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章