美文网首页
Mysql 正则表达式进行搜索(六)

Mysql 正则表达式进行搜索(六)

作者: 改昵称已被占用 | 来源:发表于2020-04-11 02:05 被阅读0次
timg.jpeg

本节将简单介绍如何在 Mysql where 子句内使用正则表达式来更好地控制数据过滤

基本字匹配符

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 关键字无异,下面将介绍更深层次的用法:

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 都匹配并返回,注意在 | 字符左右万不可空格,否则将查询不出数据

+----------+---------+-----------+-------+---------------------+
| 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 语句,它的意思是匹配中括号的内容

+----------+---------+-----------+-------+---------------------+
| 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 |
+----------+---------+-----------+-------+---------------------+

如果使用中括号来进行筛选不想被展示的内容,只需在中括号内加上 ^ 字符即可,如:

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 字符结合的所有数据,只要符合此规则就会显示(如果有 .11111 或 41111x 也满足此规则),输出为:

+----------+---------+-----------+-------+---------------------+
| 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 '\\@';

为了匹配特殊字符,必须用 \\ 为前导转义。\\- 表示查找 -\\. 表示查找 .,输出为:

+------+---------+---------------------+------+
| SId  | Sname   | Sage                | Ssex |
+------+---------+---------------------+------+
| 01   | 赵雷@   | 1990-01-01 00:00:00 | 男   |
| 02   | 钱电@   | 1990-12-21 00:00:00 | 男   |
+------+---------+---------------------+------+
元字符 说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表

匹配字符类

存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:cntrl:] ASCII控制字符( ASCII 0到31和127)
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表(同[\t])
[:digit:] 任意数字(同[0-9])
[:print:] 任意可打印字符
[:graph:] 与[:print:]相同,但不包括空格
[:lower:] 任意小写字母(同[a-z])
[: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 *
from goods
where name regexp '英寸一?';

此时的 出现次数为 0 或 1,具体输出:

+----+---------------------------------------+--------------+------------+----------+
| id | name                                  | cate_name    | brand_name | price    |
+----+---------------------------------------+--------------+------------+----------+
|  1 | r510vc 15.6英寸笔记本                 | 笔记本       | 华硕       | 3399.000 |
|  2 | y400n 14.0英寸笔记本电脑              | 笔记本       | 联想       | 4999.000 |
|  3 | g150th 15.6英寸游戏本                 | 游戏本       | 雷神       | 8499.000 |
|  4 | x550cc 15.6英寸笔记本                 | 笔记本       | 华硕       | 2799.000 |
|  6 | u330p 13.3英寸超极本                  | 超级本       | 联想       | 4299.000 |
|  8 | ipad mini 7.9英寸平板电脑             | 平板电脑     | 苹果       | 1998.000 |
|  9 | ipad air 9.7英寸平板电脑              | 平板电脑     | 苹果       | 3388.000 |
| 11 | ideacentre c340 20英寸一体电脑        | 台式机       | 联想       | 3499.000 |
| 13 | imac me086ch/a 21.5英寸一体电脑       | 台式机       | 苹果       | 9188.000 |
+----+---------------------------------------+--------------+------------+----------+

以下例子为字符类和重复元字符的结合使用:

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

此 sql 语句表示查询 goods 表中 name 字段出现了 6 次小写字母的所有数据,输出为:

+----+---------------------------------------+---------------------+------------+----------+
| id | name                                  | cate_name           | brand_name | price    |
+----+---------------------------------------+---------------------+------------+----------+
| 10 | ipad mini 配备 retina 显示屏          | 平板电脑            | 苹果       | 2788.000 |
| 11 | ideacentre c340 20英寸一体电脑        | 台式机              | 联想       | 3499.000 |
| 12 | vostro 3800-r1206 台式电脑            | 台式机              | 戴尔       | 2899.000 |
| 16 | poweredge ii服务器                    | 服务器/工作站       | 戴尔       | 5388.000 |
+----+---------------------------------------+---------------------+------------+----------+

定位符

元字符 说明
^ 文本的开头
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾

示例如下:

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

此 sql 表示查询 goods 表中 name 字段是以 iim 开头的所有数据,输出为:

+----+---------------------------------------+---------------------+------------+-----------+
| 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英寸一体电脑        | 台式机              | 联想       |  3499.000 |
| 13 | imac me086ch/a 21.5英寸一体电脑       | 台式机              | 苹果       |  9188.000 |
| 17 | mac pro专业级台式电脑                 | 服务器/工作站       | 苹果       | 28888.000 |
+----+---------------------------------------+---------------------+------------+-----------+

like 和 regexp的不同在于, like 匹配整个串而 regexp 匹配子串。利用定位符,通过用 ^ 开始每个表达式,用 $ 结束每个表达式,可以使 regexp 的作用与 like 一样

相关文章

  • 正则表达式的查询

    MySQL中使用用正则表达式 进行搜索 本小节将学习如何在MySQL WHERE子句内使用正则表达式来更好地控制数...

  • Mysql 正则表达式进行搜索(六)

    本节将简单介绍如何在 Mysql where 子句内使用正则表达式来更好地控制数据过滤 基本字匹配符 输出为: r...

  • MySQL——用正则表达式进行搜索(六)

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQ...

  • MySql基本操作(二)

    1. 正则表达式 MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹...

  • MySQL笔记

    MySQL学习笔记 [toc] 登录和退出MySQL服务器 基本语法 正则表达式 字段拼接 分组 全文搜索 视图 ...

  • MySQL用正则表达式进行搜索

    用正则表达式进行搜索 1.正则表达式介绍 ​ 对于基于的过滤(或者甚至是某些不那么基本的过滤),可以用匹配、比...

  • 2018-11-22 metasploit 框架mysql_lo

    msf > search mysql_login (搜索mysql_login模块(针对mysql进行暴力破解)...

  • mysql(04day)

    Mysql支持正则表达式的匹配,Mysql中使用REGEXP操作符来进行正则表达式匹配。 下面中的正则模式中可用于...

  • MYSQL 正则查询

    正则表达式: 正则表达式是为复杂搜索指定模式的强大方式。 ^ 所匹配的字符串以后面的字符串开头 mysql> se...

  • 【2017-08-29】字符串及文本的处理(四)

    字符串搜索与合并 正则表达式中使用Unicode问题:提取一段文本中的所有中文使用re模块中的正则表达式进行搜索与...

网友评论

      本文标题:Mysql 正则表达式进行搜索(六)

      本文链接:https://www.haomeiwen.com/subject/orksmhtx.html