正则表达式过滤数据

这篇博客介绍了如何在MySQL中使用正则表达式进行数据过滤,包括基本字符匹配、或(|)匹配、匹配字符集合、匹配范围、匹配特殊字符、匹配多个字符以及定位符的使用方法。通过实例展示了如何在WHERE子句中应用正则表达式来筛选以特定字符结尾或符合特定条件的数据记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式的作用是匹配文本,将一个正则表达式与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了支持,允许你指定正则表达式,过滤SELECT检索出的数据。

MySQL仅支持部分正则表达式。

SELECT 列名 FROM 表名 REGEXP 正则表达式;

基本字符匹配

假设有一张表computer_products

idproductprice
1耳机159
2鼠标199
3键盘659
4显示器899

以正则表达式匹配表中以99结尾的商品:

mysql> SELECT * FROM computer_products WHERE price REGEXP '.99';
+----+---------+-------+
| id | product | price |
+----+---------+-------+
|  2 | 鼠标    |   199 |
|  4 | 显示器  |   899 |
+----+---------+-------+
2 rows in set (0.00 sec)

.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此,199899都匹配
且返回。

MySQL中的正则表达式匹配不区分大小写,大写和小写都匹配。为区分大小写,可在REGEXP后使用BINARY关键字。

或(|)匹配

以正则表达式匹配表中价格为159199的商品:

mysql> SELECT * FROM computer_products WHERE price REGEXP '159|199';
+----+---------+-------+
| id | product | price |
+----+---------+-------+
|  1 | 耳机    |   159 |
|  2 | 鼠标    |   199 |
+----+---------+-------+
2 rows in set (0.00 sec)

|为正则表达式的OR操作符。它表示匹配其中之一,因此159199都匹配并返回。

使用|从功能上类似于在SELECT语句中使用OR语句,多个OR条件可并入单个正则表达式。

匹配字符集合中几个字符之一

以正则表达式匹配表中价格为159659859的商品:

mysql> SELECT * FROM computer_products WHERE price REGEXP '[168]59';
+----+---------+-------+
| id | product | price |
+----+---------+-------+
|  1 | 耳机    |   159 |
|  3 | 键盘    |   659 |
+----+---------+-------+
2 rows in set (0.00 sec)

这里,使用了正则表达式[168]59[168]定义一组字符,它的意思是匹配168,因此,159659都匹配且返回,没有859,因此没有返回。

[]是另一种形式的OR语句。正则表达式[168]59[1|6|8]59的缩写,也可以使用后者。但必须使用[]包裹。

如果不使用[]包裹时,结果如下:

mysql> SELECT * FROM computer_products WHERE price REGEXP '1|6|859';
+----+---------+-------+
| id | product | price |
+----+---------+-------+
|  1 | 耳机    |   159 |
|  2 | 鼠标    |   199 |
|  3 | 键盘    |   659 |
+----+---------+-------+
3 rows in set (0.00 sec)

两个期望的行被检索出来,但还检索出了另外1行。之所以这样是由于MySQL认为检索条件是16859

匹配范围

集合可用来定义要匹配的一个或多个字符。例如使用[0123456789]表示匹配0~9,这个表达式可以简写为[0-9]。同样范围不一定是数字,也可以是[a-Z]来匹配任意字符。

例如:

mysql> SELECT * FROM computer_products WHERE price REGEXP '[0-9]59';
+----+---------+-------+
| id | product | price |
+----+---------+-------+
|  1 | 耳机    |   159 |
|  3 | 键盘    |   659 |
+----+---------+-------+
2 rows in set (0.00 sec)

匹配特殊字符

为了匹配特殊字符,必须用\\进行转义。\\-表示查找-\\.表示查找.。正则表达式内具有特殊意义的所有字符都必须以这种方式转义。

\\也用来转义元字符,包括:

元字符说明
\\f换页
\\n换行
\\r回车
\\t制表
\\v纵向制表

为了匹配反斜杠(\)本身,需要使用\\\来转义。

匹配多个字符

之前的所有正则表达式都试图匹配单次出现,当需要匹配多次出现时,需要使用重复元字符。

元字符说明
*0个或多个匹配
+1个或多个匹配,等同于{1,}
0个或1个匹配 ,等同于{0,1}
{n}指定个数的匹配
{n,}不少于指定数目的匹配
{n,m}匹配数目的范围,m不超过255

例如匹配包含**9的商品:

mysql> SELECT * FROM computer_products WHERE price REGEXP '[0-9]*9';
+----+---------+-------+
| id | product | price |
+----+---------+-------+
|  1 | 耳机    |   159 |
|  2 | 鼠标    |   199 |
|  3 | 键盘    |   659 |
|  4 | 显示器  |   899 |
+----+---------+-------+
4 rows in set (0.00 sec)

定位符

前面所有例子都是匹配一个组字符串中任意位置的字符。为了匹配特定位置的文本,需要使用下表中列出的定位符。

元字符说明
^文本的开始
$文本的结束

以匹配用9结尾的商品为例:

mysql> SELECT * FROM computer_products WHERE price REGEXP '[0-9]*9$';
+----+---------+-------+
| id | product | price |
+----+---------+-------+
|  1 | 耳机    |   159 |
|  2 | 鼠标    |   199 |
|  3 | 键盘    |   659 |
|  4 | 显示器  |   899 |
+----+---------+-------+
4 rows in set (0.00 sec)

可以在不使用数据库和表的情况下在MySQL中测试正则表达式,例如:

 mysql> SELECT 'hello' REGEXP '^[a-z]{4}o$';
+------------------------------+
| 'hello' REGEXP '^[a-z]{4}o$' |
+------------------------------+
|                            1 |
+------------------------------+
1 row in set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值