預備閱讀:
MySQL中用正則表達式進行搜索1、使用MySQL正則表達式(1)基本字符串匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘1000’
ORDER BY prod_name;
檢索prod_name包含文本1000的所有行。
除關鍵字LIKE被REGEXP替代外,這條語句看上去非常像使用
LIKE的語句(第8章)。它告訴MySQL: REGEXP后所跟的東西作
為正則表達式(與文字正文1000匹配的一個正則表達式)處理。
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘.000’
ORDER BY prod_name;
正則中,.代表匹配任意一個字符。
區分大小寫時:使用BINARY關鍵字
WHERE prod_name REGEXP BINARY ‘JetPack .000’;
(2)進行OR匹配(使用‘|’)
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘1000|2000’
ORDER BY prod_name;
可使用多個。
(3)匹配幾個字符之一
用[和]括起來的字符完成
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘[123] Ton’
ORDER BY prod_name;
[]是另一種形式的OR語句。 事實上,正則表達式[123]Ton
為[1|2|3]Ton的縮寫,也可以使用后者。但是,需要用[]來定義OR語句查找什么。
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘1|2|3 Ton’
ORDER BY prod_name;
(4)匹配范圍
下面的集合將匹配數字0到9:[0-9],a到z:[a-z]
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘[1-5] Ton’
ORDER BY prod_name;
(5) 匹配特殊字符
必須用\\為前導,\\-表示查找-,.
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP ‘\\.’
ORDER BY vend_name;
這種處理就是所謂的轉義( escaping),正則表達式內具有特殊意義的所有字符都必須以這種方式轉義。
匹配\ 為了匹配反斜杠( \)字符本身,需要使用\\\。
元 字 符 說 明
\\f 換頁
\\n 換行
\\r 回車
\\t 制表
\\v 縱向制表
(6)匹配字符類
存在找出你自己經常使用的數字、所有字母字符或所有數字字母字
符等的匹配。為更方便工作,可以使用預定義的字符集,稱為字符類
( character class)。
字符類 說 明
[:alnum:] 任意字母和數字(同[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\\t])
[:cntrl:] ASCII控制字符( ASCII 0到31和127)
[:digit:] 任意數字(同[0-9])
[:graph:] 與[:print:]相同,但不包括空格
[:lower:] 任意小寫字母(同[a-z])
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在內的任意空白字符(同[\\f\\n\\r\\t\\v])
[:upper:] 任意大寫字母(同[A-Z])
[:xdigit:] 任意十六進制數字(同[a-fA-F0-9])
(7)匹配多個實例
重復元字符
元字符 說 明
* 0個或多個匹配
+ 1個或多個匹配(等於{1,})
? 0個或1個匹配(等於{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會非常困難。
匹配連在一起的4位數字:
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘[[:digit:]]{4}’
ORDER BY prod_name;
[:digit:]匹配任意數字,因而它為數字的一個集合。 {4}確切地要求它前面的字符(任意數字)出現4次,所以[[:digit:]]{4}匹配連在一起的任意4位數字。或者如下
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘[0-9] [0-9] [0-9] [0-9]’
ORDER BY prod_name;
(8)定位符
匹配特定位置的文本,需要使用定位元字符。
元字符說明
^ 文本的開始
$ 文本的結尾
[[:<:]] 詞的開始
[[:>:]] 詞的結尾
SELECT prod_name
FROM products
WHERE prod_name REGEXP ‘^[0-9\\.]’
ORDER BY prod_name;
^匹配串的開始。因此, ^[0-9\\.]只在.或任意數字為串中第
一個字符時才匹配它們。
^的雙重用途^有兩種用法。在集合中(用[和]定義),用它
來否定該集合,否則,用來指串的開始處。
轉自: