Mysql 正則表達式進行搜索(六)

timg.jpeg

本節(jié)將簡單介紹如何在 Mysql where 子句內(nèi)使用正則表達式來更好地控制數(shù)據(jù)過濾

基本字匹配符

select *
from student
where sname regexp '紅'

輸出為:

+------+-----------+---------------------+------+
| SId  | Sname     | Sage                | Ssex |
+------+-----------+---------------------+------+
| 05   | 周紅梅    | 1991-12-01 00:00:00 | 女   |
| 06   | 吳紅蘭    | 1992-03-01 00:00:00 | 女   |
+------+-----------+---------------------+------+

regexp 的簡單用法與 like 關(guān)鍵字無異,下面將介紹更深層次的用法:

select * 
from order_info_utf
where user_id regexp '.1111'
order by user_id;

此 sql 語句使用了正則表達式 .1111,. 是正則語言中的一個特殊字符,表示匹配任意一個字符

+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time            |
+----------+---------+-----------+-------+---------------------+
| 527086   | 101111  | 已支付    | 762   | 2016-04-28 22:58:00 |
| 538215   | 101111  | 已支付    | 601   | 2016-04-30 20:20:00 |
| 432821   | 11111   | 已支付    | 818   | 2016-04-18 13:16:00 |
| 515923   | 21111   | 已支付    | 1139  | 2016-04-27 18:54:00 |
| 93287    | 31111   | 已支付    | 589   | 2016-03-11 21:36:00 |
| 240508   | 31111   | 已支付    | 521   | 2016-03-28 07:31:00 |
| 154261   | 41111   | 未支付    | 834   | NULL                |
| 288954   | 41111   | 已支付    | 471   | 2016-04-01 23:55:00 |
| 46030    | 51111   | 未支付    | 986   | NULL                |
| 93874    | 61111   | 未支付    | 485   | NULL                |
| 20444    | 71111   | 已支付    | 436   | 2016-03-03 12:17:00 |
| 216118   | 71111   | 已支付    | 550   | 2016-03-25 08:22:00 |
| 258402   | 71111   | 已支付    | 954   | 2016-03-29 19:54:00 |
| 442332   | 71111   | 已支付    | 806   | 2016-04-19 12:48:00 |
| 95510    | 81111   | 已支付    | 716   | 2016-03-12 10:26:00 |
| 318583   | 91111   | 已支付    | 564   | 2016-04-05 22:35:00 |
+----------+---------+-----------+-------+---------------------+

進行 or 匹配

select * 
from order_info_utf
where user_id regexp '11111|22222'
order by user_id;

語句中使用了正則表達式 11111|22222 。 | 為正則表達式的 or 操作符。它表示匹配其中之一,因此 11111 和22222 都匹配并返回,注意在 | 字符左右萬不可空格,否則將查詢不出數(shù)據(jù)

+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time            |
+----------+---------+-----------+-------+---------------------+
| 432821   | 11111   | 已支付    | 818   | 2016-04-18 13:16:00 |
| 49113    | 22222   | 已支付    | 439   | 2016-03-07 10:31:00 |
| 328158   | 22222   | 未支付    | 450   | NULL                |
| 328548   | 22222   | 未支付    | 412   | NULL                |
| 331328   | 22222   | 已支付    | 442   | 2016-04-07 08:45:00 |
+----------+---------+-----------+-------+---------------------+

匹配幾個字符之一

select *
from order_info_utf
where user_id regexp '[1,2,3]1111'
order by user_id;

[] 是另一種形式的 or 語句,它的意思是匹配中括號的內(nèi)容

+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time            |
+----------+---------+-----------+-------+---------------------+
| 432821   | 11111   | 已支付    | 818   | 2016-04-18 13:16:00 |
| 515923   | 21111   | 已支付    | 1139  | 2016-04-27 18:54:00 |
| 93287    | 31111   | 已支付    | 589   | 2016-03-11 21:36:00 |
| 240508   | 31111   | 已支付    | 521   | 2016-03-28 07:31:00 |
+----------+---------+-----------+-------+---------------------+

如果使用中括號來進行篩選不想被展示的內(nèi)容,只需在中括號內(nèi)加上 ^ 字符即可,如:

select *
from order_info_utf
where user_id regexp '[^1,2,3]1111'
order by user_id;

輸出為:

+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time            |
+----------+---------+-----------+-------+---------------------+
| 527086   | 101111  | 已支付    | 762   | 2016-04-28 22:58:00 |
| 538215   | 101111  | 已支付    | 601   | 2016-04-30 20:20:00 |
| 154261   | 41111   | 未支付    | 834   | NULL                |
| 288954   | 41111   | 已支付    | 471   | 2016-04-01 23:55:00 |
| 46030    | 51111   | 未支付    | 986   | NULL                |
| 93874    | 61111   | 未支付    | 485   | NULL                |
| 20444    | 71111   | 已支付    | 436   | 2016-03-03 12:17:00 |
| 216118   | 71111   | 已支付    | 550   | 2016-03-25 08:22:00 |
| 258402   | 71111   | 已支付    | 954   | 2016-03-29 19:54:00 |
| 442332   | 71111   | 已支付    | 806   | 2016-04-19 12:48:00 |
| 95510    | 81111   | 已支付    | 716   | 2016-03-12 10:26:00 |
| 318583   | 91111   | 已支付    | 564   | 2016-04-05 22:35:00 |
+----------+---------+-----------+-------+---------------------+

匹配范圍

集合可用來定義要匹配的一個或多個字符

select *
from order_info_utf
where user_id regexp '[1-4]1111'
order by user_id;

此 sql 語句表示匹配 1-4 中任意一個字符與 1111 字符結(jié)合的所有數(shù)據(jù),只要符合此規(guī)則就會顯示(如果有 .11111 或 41111x 也滿足此規(guī)則),輸出為:

+----------+---------+-----------+-------+---------------------+
| order_id | user_id | pay_state | price | pay_time            |
+----------+---------+-----------+-------+---------------------+
| 432821   | 11111   | 已支付    | 818   | 2016-04-18 13:16:00 |
| 515923   | 21111   | 已支付    | 1139  | 2016-04-27 18:54:00 |
| 93287    | 31111   | 已支付    | 589   | 2016-03-11 21:36:00 |
| 240508   | 31111   | 已支付    | 521   | 2016-03-28 07:31:00 |
| 154261   | 41111   | 未支付    | 834   | NULL                |
| 288954   | 41111   | 已支付    | 471   | 2016-04-01 23:55:00 |
+----------+---------+-----------+-------+---------------------+

匹配特殊字符

select *
from student
where sname regexp '\\@';

為了匹配特殊字符,必須用 \\ 為前導(dǎo)轉(zhuǎn)義。\\- 表示查找 -, \\. 表示查找 .,輸出為:

+------+---------+---------------------+------+
| SId  | Sname   | Sage                | Ssex |
+------+---------+---------------------+------+
| 01   | 趙雷@   | 1990-01-01 00:00:00 | 男   |
| 02   | 錢電@   | 1990-12-21 00:00:00 | 男   |
+------+---------+---------------------+------+
元字符 說明
\\f 換頁
\\n 換行
\\r 回車
\\t 制表
\\v 縱向制表

匹配字符類

存在找出你自己經(jīng)常使用的數(shù)字、所有字母字符或所有數(shù)字字母字符等的匹配

說明
[:alnum:] 任意字母和數(shù)字(同[a-zA-Z0-9])
[:cntrl:] ASCII控制字符( ASCII 0到31和127)
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\t])
[:digit:] 任意數(shù)字(同[0-9])
[:print:] 任意可打印字符
[:graph:] 與[:print:]相同,但不包括空格
[:lower:] 任意小寫字母(同[a-z])
[:space:] 包括空格在內(nèi)的任意空白字符(同[\f\n\r\t\v])
[:upper:] 任意大寫字母(同[A-Z])
[:xdigit:] 任意十六進制數(shù)字(同[a-fA-F0-9])

匹配多個實例

元字符 說明
* 0 個或多個匹配
+ 1個或多個匹配(等于 {1,})
? 0 個或 1 個匹配(等于 {0,1})
{n} 指定數(shù)目的匹配
{n,} 不少于指定數(shù)目的匹配
{n,m} 匹配數(shù)目的范圍(m 不超過 255)

示例如下:

select *
from goods
where name regexp '英寸一?';

此時的 出現(xiàn)次數(shù)為 0 或 1,具體輸出:

+----+---------------------------------------+--------------+------------+----------+
| id | name                                  | cate_name    | brand_name | price    |
+----+---------------------------------------+--------------+------------+----------+
|  1 | r510vc 15.6英寸筆記本                 | 筆記本       | 華碩       | 3399.000 |
|  2 | y400n 14.0英寸筆記本電腦              | 筆記本       | 聯(lián)想       | 4999.000 |
|  3 | g150th 15.6英寸游戲本                 | 游戲本       | 雷神       | 8499.000 |
|  4 | x550cc 15.6英寸筆記本                 | 筆記本       | 華碩       | 2799.000 |
|  6 | u330p 13.3英寸超極本                  | 超級本       | 聯(lián)想       | 4299.000 |
|  8 | ipad mini 7.9英寸平板電腦             | 平板電腦     | 蘋果       | 1998.000 |
|  9 | ipad air 9.7英寸平板電腦              | 平板電腦     | 蘋果       | 3388.000 |
| 11 | ideacentre c340 20英寸一體電腦        | 臺式機       | 聯(lián)想       | 3499.000 |
| 13 | imac me086ch/a 21.5英寸一體電腦       | 臺式機       | 蘋果       | 9188.000 |
+----+---------------------------------------+--------------+------------+----------+

以下例子為字符類和重復(fù)元字符的結(jié)合使用:

select * 
from goods 
where name regexp '[:lower:]{6}';

此 sql 語句表示查詢 goods 表中 name 字段出現(xiàn)了 6 次小寫字母的所有數(shù)據(jù),輸出為:

+----+---------------------------------------+---------------------+------------+----------+
| id | name                                  | cate_name           | brand_name | price    |
+----+---------------------------------------+---------------------+------------+----------+
| 10 | ipad mini 配備 retina 顯示屏          | 平板電腦            | 蘋果       | 2788.000 |
| 11 | ideacentre c340 20英寸一體電腦        | 臺式機              | 聯(lián)想       | 3499.000 |
| 12 | vostro 3800-r1206 臺式電腦            | 臺式機              | 戴爾       | 2899.000 |
| 16 | poweredge ii服務(wù)器                    | 服務(wù)器/工作站       | 戴爾       | 5388.000 |
+----+---------------------------------------+---------------------+------------+----------+

定位符

元字符 說明
^ 文本的開頭
$ 文本的結(jié)尾
[[:<:]] 詞的開始
[[:>:]] 詞的結(jié)尾

示例如下:

select *
from goods
where name regexp '^[im?]';

此 sql 表示查詢 goods 表中 name 字段是以 iim 開頭的所有數(shù)據(jù),輸出為:

+----+---------------------------------------+---------------------+------------+-----------+
| id | name                                  | cate_name           | brand_name | price     |
+----+---------------------------------------+---------------------+------------+-----------+
|  8 | ipad mini 7.9英寸平板電腦             | 平板電腦            | 蘋果       |  1998.000 |
|  9 | ipad air 9.7英寸平板電腦              | 平板電腦            | 蘋果       |  3388.000 |
| 10 | ipad mini 配備 retina 顯示屏          | 平板電腦            | 蘋果       |  2788.000 |
| 11 | ideacentre c340 20英寸一體電腦        | 臺式機              | 聯(lián)想       |  3499.000 |
| 13 | imac me086ch/a 21.5英寸一體電腦       | 臺式機              | 蘋果       |  9188.000 |
| 17 | mac pro專業(yè)級臺式電腦                 | 服務(wù)器/工作站       | 蘋果       | 28888.000 |
+----+---------------------------------------+---------------------+------------+-----------+

like 和 regexp的不同在于, like 匹配整個串而 regexp 匹配子串。利用定位符,通過用 ^ 開始每個表達式,用 $ 結(jié)束每個表達式,可以使 regexp 的作用與 like 一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容