mysql必知必會--用正則表達式 進行搜索

正則表達式介紹

前兩章中的過濾例子容許用匹配、比較和通配操做符尋找數據。對
於基本的過濾(或者甚至是某些不那麼基本的過濾),這樣就足夠了。但
隨着過濾條件的複雜性的增長, WHERE 子句自己的複雜性也有必要增長。
這也就是正則表達式變得有用的地方。正則表達式是用來匹配文本
的特殊的串(字符集合)。若是你想從一個文本文件中提取電話號碼,可
以使用正則表達式。若是你須要查找名字中間有數字的全部文件,能夠
使用一個正則表達式。若是你想在一個文本塊中找到全部重複的單詞,
可使用一個正則表達式。若是你想替換一個頁面中的全部URL爲這些
URL的實際HTML連接,也可使用一個正則表達式(對於最後這個例子,
或者是兩個正則表達式)。
全部種類的程序設計語言、文本編輯器、操做系統等都支持正則表
達式。有見識的程序員和網絡管理員已經關注做爲他們技術工具重要內
容的正則表達式很長時間了。
正則表達式用正則表達式語言來創建,正則表達式語言是用來完成
剛討論的全部工做以及更多工做的一種特殊語言。與任意語言同樣,正
則表達式具備你必須學習的特殊的語法和指令mysql

使用MySQL正則表達式

那麼,正則表達式與MySQL有何關係?已經說過,正則表達式的做
用是匹配文本,將一個模式(正則表達式)與一個文本串進行比較。MySQL
用 WHERE 子句對正則表達式提供了初步的支持,容許你指定正則表達式,
過濾 SELECT 檢索出的數據git

僅爲正則表達式語言的一個子集 若是你熟悉正則表達式,需
要注意:MySQL僅支持多數正則表達式實現的一個很小的子
集。本章介紹MySQL支持的大多數內容。程序員

基本字符匹配

咱們從一個很是簡單的例子開始。下面的語句檢索列 prod_name 包含
文本 1000 的全部行

除關鍵字 LIKE 被 REGEXP 替代外,這條語句看上去很是像使用
LIKE 的語句(第8章)。它告訴MySQL: REGEXP 後所跟的東西做
爲正則表達式(與文字正文 1000 匹配的一個正則表達式)處理正則表達式

爲何要費力地使用正則表達式?在剛纔的例子中,正則表達式確
實沒有帶來太多好處(可能還會下降性能),不過,請考慮下面的例子
sql

這裏使用了正則表達式 .000 。 . 是正則表達式語言中一個特殊
的字符。它表示匹配任意一個字符,所以, 1000 和 2000 都匹配
且返回。
固然,這個特殊的例子也能夠用 LIKE 和通配符來完成api

LIKE 匹配整個列。若是被匹配的文本在列值
中出現, LIKE 將不會找到它,相應的行也不被返回(除非使用
通配符)。而 REGEXP 在列值內進行匹配,若是被匹配的文本在
列值中出現, REGEXP 將會找到它,相應的行將被返回。這是一
個很是重要的差異。的做用)?答案是確定的,使用 ^ 和 $ 定位符(anchor)便可,
本章後面介紹。網絡

匹配不區分大小寫 MySQL中的正則表達式匹配(自版本
3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。爲區分大
小寫,可以使用 BINARY 關鍵字,如 WHERE prod_name REGEXP
BINARY 'JetPack .000'編輯器

匹配幾個字符之一

匹配任何單一字符。可是,若是你只想匹配特定的字符,怎麼辦?
可經過指定一組用 [ 和 ] 括起來的字符來完成,以下所示:
工具

這裏,使用了正則表達式 [123] Ton 。 [123] 定義一組字符,它
的意思是匹配 1 或 2 或 3 ,所以, 1 ton 和 2 ton 都匹配且返回(沒
有 3 ton )。
正如所見, [] 是另外一種形式的 OR 語句。事實上,正則表達式 [123]Ton
爲 [1|2|3]Ton 的縮寫,也可使用後者。可是,須要用 [] 來定義 OR 語句
查找什麼。爲更好地理解這一點,請看下面的例子:


這並非指望的輸出。兩個要求的行被檢索出來,但還檢索出
了另外3行。之因此這樣是因爲MySQL假定你的意思是 '1' 或
'2' 或 '3 ton' 。除非把字符 | 括在一個集合中,不然它將應用於整個串。
字符集合也能夠被否認,即,它們將匹配除指定字符外的任何東西。
爲否認一個字符集,在集合的開始處放置一個 ^ 便可。所以,儘管 [123]
匹配字符 1 、 2 或 3 ,但 [^123] 卻匹配除這些字符外的任何東西性能

匹配範圍

集合可用來定義要匹配的一個或多個字符。例如,下面的集合將匹
配數字0到9:

這裏使用正則表達式 [1-5] Ton 。 [1-5] 定義了一個範圍,這個
表達式意思是匹配 1 到 5 ,所以返回3個匹配行。因爲 5 ton 匹配,
因此返回 .5 ton 。

匹配特殊字符

正則表達式語言由具備特定含義的特殊字符構成。咱們已經看到 . 、 [] 、
| 和 - 等,還有其餘一些字符。請問,若是你須要匹配這些字符,應該怎麼
辦呢?例如,若是要找出包含 . 字符的值,怎樣搜索?請看下面的例子

這並非指望的輸出, . 匹配任意字符,所以每一個行都被檢索出
來。爲了匹配特殊字符,必須用 \ 爲前導。 \- 表示查找 - , \. 表示查找 .

這種處理
就是所謂的轉義(escaping),正則表達式內具備特殊意義的所
有字符都必須以這種方式轉義。這包括 . 、 | 、 [] 以及迄今爲止使用過的
其餘特殊字符。
\ 也用來引用元字符(具備特殊含義的字符),如表9-1所列。

匹配  爲了匹配反斜槓(  )字符自己,須要使用 \ 。
 或 \? 多數正則表達式實現使用單個反斜槓轉義特殊字符,
以便能使用這些字符自己。但MySQL要求兩個反斜槓(MySQL
本身解釋一個,正則表達式庫解釋另外一個)。

匹配字符類

存在找出你本身常用的數字、全部字母字符或全部數字字母字
符等的匹配。爲更方便工做,可使用預約義的字符集,稱爲字符類
(character class)。表9-2列出字符類以及它們的含義

匹配多個實例

目前爲止使用的全部正則表達式都試圖匹配單次出現。若是存在一
個匹配,該行被檢索出來,若是不存在,檢索不出任何行。但有時須要
對匹配的數目進行更強的控制。例如,你可能須要尋找全部的數,無論
數中包含多少數字,或者你可能想尋找一個單詞而且還可以適應一個尾
隨的 s (若是存在),等等
這能夠用表9-3列出的正則表達式重複元字符來完成

定位符

目前爲止的全部例子都是匹配一個串中任意位置的文本。爲了匹配特定位置的文本,須要使用表9-4列出的定位符

例如,若是你想找出以一個數(包括以小數點開始的數)開始的所
有產品,怎麼辦?簡單搜索 [0-9\.] (或 [[:digit:]\.] )不行,由於
它將在文本內任意位置查找匹配。解決辦法是使用 ^ 定位符,以下所示

^ 匹配串的開始。所以, ^[0-9\.] 只在 . 或任意數字爲串中第
一個字符時才匹配它們。

^ 的雙重用途 ^ 有兩種用法。在集合中(用 [ 和 ] 定義),用它
來否認該集合,不然,用來指串的開始處

使 REGEXP 起相似 LIKE 的做用 本章前面說過, LIKE 和 REGEXP
的不一樣在於, LIKE 匹配整個串而 REGEXP 匹配子串。利用定位
符,經過用 ^ 開始每一個表達式,用 $ 結束每一個表達式,可使
REGEXP 的做用與 LIKE 同樣

本章介紹了正則表達式的基礎知識,學習瞭如何在MySQL的 SELECT 語句中經過 REGEXP 關鍵字使用它們

相關文章
相關標籤/搜索