用正則運算式進行搜索
正則運算式介紹
正則運算式是用來匹配文本的特殊的串(字符集合),
使用MySQL正則運算式
MySQL用WHERE子句對正則運算式提供了初步的支持,允許你指定正則運算式,過濾SELECT檢索出的資料,MySQL僅支持多數正則運算式實作的一個很小的子集,
基本字符匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
除關鍵字LIKE被REGEXP替代外,這條陳述句看上去非常像使用LIKE的陳述句,
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
.是正則運算式語言中一個特殊的字符,它表示匹配任意一個字符,
注意:
- 在LIKE和REGEXP之間有一個重要的差別,LIKE匹配整個列,如果被匹配的文本在列值中出現,LIKE將不會找到它,相應的行也不被回傳(除非使用通配符),而REGEXP在列值內進行匹配,如果被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被回傳,
- MySQL中的正則運算式匹配不區分大小寫(即,大寫和小寫都匹配),為區分大小寫,可使用BINARY關鍵字,如WHERE prod_name REGEXP BINARY 'JetPack .000',
進行OR匹配
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
|為正則運算式的OR運算子,它表示匹配其中之一,因此1000和2000都匹配并回傳,
匹配幾個字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
[123]定義一組字符,它的意思是匹配1或2或3,[]是另一種形式的OR陳述句,事實上,正則運算式[123]Ton為[1|2|3]Ton的縮寫,為否定一個字符集,在集合的開始處放置一個即可,因此,盡管[123]匹配字符1、2或3,但[123]卻匹配除這些字符外的任何東西,
匹配范圍
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
[1-5]定義了一個范圍,這個運算式意思是匹配1到5,
匹配特殊字符
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;
\.匹配.,這種處理就是所謂的轉義(escaping),正則運算式內具有特殊意義的所有字符都必須以這種方式轉義,這包括.、|、[]以及迄今為止使用過的其他特殊字符,
\\也用來參考元字符(具有特殊含義的字符):
| 元字符 | 說明 |
|---|---|
| \f | 換頁 |
| \n | 換行 |
| \r | 回車 |
| \t | 制表 |
| \v | 縱向制表 |
匹配字符類
存在找出你自己經常使用的數字、所有字母字符或所有數字字母字符等的匹配,為更方便作業,可以使用預定義的字符集,稱為字符類(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]) |
匹配多個實體
| 元 字 符 | 說 明 |
|---|---|
| * | 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]匹配任意數字(這個例子中為1和5),sticks?匹配stick和sticks(s后的?使s可選,因為?匹配它前面的任何字符的0次或1次出現),\\ )匹配),
定位符
| 元 字 符 | 說 明 |
|---|---|
| ^ | 文本的開始 |
| $ | 文本的結尾 |
| [[:<:]] | 詞的開始 |
| [[:>:]] | 詞的結尾 |
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;
^匹配串的開始,因此,^[0-9\.]只在.或任意數字為串中第一個字符時才匹配它們,
注意:
- ^的雙重用途 ^有兩種用法:在集合中(用[和]定義),用它來否定該集合,否則,用來指串的開始處,
- 簡單的正則運算式測驗:可以在不使用資料庫表的情況下用SELECT來測驗正則運算式,
SELECT 'hello' REGEXP '[0-9]';
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/542113.html
標籤:MySQL
