學習目的:
如何在MySQL WHERE子句內使用正則表達式來更好控制數據過濾。
正則表達式介紹:
正則表達式是用來匹配文本的特殊的串(字符集合)。
所有種類的程序設計語言,文本編輯器,操作系統等都支持正則表達式。
使用MySQL正則表達式:
基本字符匹配:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
. 是正則表達式語言中一個特殊的字符,它表示匹配任意一個字符,因此1000和2000都能匹配。
LIKE匹配整個列,如果配匹配的文本在列值中出現,LIKE將不會找到它,相應的行也不被返回(除非使用通配符)
REGEXP在列值內進行匹配,如果被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回,這是一個非常重要的差別。
匹配不區分大小寫:如果要區分大小寫,要用BINARY關鍵字。如 WNERE prod_name REGEXP BINARY 'JecPack .000'。
進行OR匹配:
為搜索兩個串之一(或者為另一個串),使用|。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
兩個以上的OR條件:可以給出兩個以上的OR條件。如'1000|2000|3000|'.
匹配幾個字符之一:
如果你只想匹配特定的字符,怎么辦?可通過指定一組用[和]括起來的字符來完成。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
其中'[123] Ton'是'[1|2|3] Ton'的簡寫。
字符集也可以被否定。為否定一個字符集,在集合的開始出放置一個^即可。如[^123]
匹配范圍:
集合可用來定義要匹配的一個或多個字符。例如,下列的集合將匹配0到9,
[0123456789]為簡化這中寫法,可寫為[0-9]。范圍不限於完整的集合。[1-3],[6-9]也是合法的。此外。范圍不一定是數值,[A-Z]匹配任意字母字符。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;
匹配特殊字符:
例如要找出包含.字符的值,怎么搜索?為了匹配特殊字符,必須用\\為前導。\\-表示查找-。
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\ .'
ORDER BY vend_name;
這種處理就是所謂的轉義(escaping),正則表達式內具有特殊意義的所有字符都必須用這種方式轉義。
\\ 也用來引用元字符(含有特殊意義的字符),如下所列
\\ f 換頁
\\ n 換行
\\ r 回車
\\ t 制表
\\ v 縱向制表
為了匹配反斜杠本身,必須使用\\\
\或\\,多數正則表達式實現使用單個反斜杠轉義特殊字符,以便能使用這些字符本身,但MySQL要求兩個反斜杠(MySQL自己解釋一個,正則表達式庫解釋另一個)。
匹配字符類:
存在找出你自己經常使用的數字,所有字母字符或所有數字字母等的匹配。
字符類(預定義字符集):
類
|
說明
|
[:alnum:]
|
任意字母和數字
|
[:alpha:]
|
任意字符
|
[:blank:]
|
空格和制表
|
[:cntrl:]
|
ASCII控制字符
|
[:digit:]
|
任意數字
|
[:graph:]
|
與[:print:]相同,但不包括空格
|
[:lower:]
|
任意小寫字母
|
[:print:]
|
任意可打印字符
|
[:punct:]
|
既不在[:alnum]又不在[:cntrl]中的字符
|
[:space:]
|
包括空格在內的任意空白字符
|
[:upper:]
|
任意大寫字母
|
[:xdigit:]
|
任意十六進制數字
|
匹配多個實例:
元字符
|
說明
|
*
|
0個或多個匹配
|
+
|
一個或多個匹配(等於{1,0})
|
?
|
0個或一個匹配(等一{0,1})
|
{n}
|
指定數目的匹配
|
{n, }
|
不少於指定數目的匹配
|
{n,m}
|
匹配數目的范圍(m不超過255)
|
SELECT prod_name
FROM products
WHERE prod_name REGEXP '
\\([0-9] sticks?\\)'
ORDER BY prod_name;
正則表達式\\([0-9] sticks?\\)需要解說一下。\\(匹配),
[0-9]匹配任意數字(這個例子中為1和5),sticks?匹配stick 和sticks(s后的?使s可選,因為?匹配它前面的任何字符的0次或1次出現),\\)匹配)。沒有?,匹配stick和sticks會非常困難。
定位符:
目前為止的所有例子都是匹配一個串中任意為止的文本。為了匹配特定為止的文本,需要使用如下列出的定位符。
元字符
|
說明
|
^
|
文本的開始
|
$
|
文本的結尾
|
[[:<:]]
|
詞的開始
|
[[:>:]]
|
詞的結尾
|
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\]'
ORDER BY prod_name;
簡單的正則表達式測試:
可以在不適用數據庫表的情況在用SELECT來測試正則表達式。REGEXP檢查總是返回0(么沒有匹配)或1(匹配)。可以用帶文字串的REGEXP來測試表達式,並實驗它們。如:
SELECT 'hello' REGEXP '[0-9]'
返回0