第九章 用正則表達式進行搜索


學習目的:
如何在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
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM