MySQL正则表达式匹配查询实战指南

今天早睡
今天早睡
发布时间:2026-10-15| 2人浏览过
原创

在MySQL复杂数据过滤场景中,`REGEXP`操作符提供了比`LIKE`更强大的文本模式匹配能力。本文详细讲解MySQL正则表达式的语法规则与实战用法。

正则表达式基础

MySQL支持通过`REGEXP`(或`RLIKE`)操作符执行正则表达式匹配。相较于传统的`LIKE`通配符(`_`和`%`),正则表达式允许用户定义复杂的搜索模式,用于精确查找包含特定字符组合、结构或边界条件的数据行。需注意,默认情况下,MySQL的`REGEXP`匹配不区分大小写。

测试数据准备

为了演示各种匹配场景,首先在数据库`regexp_test`表中创建以下测试数据:

mysql> select * from regexp_test;
+------+----------+
| id   | name     |
+------+----------+
|    1 | xiaoming |
|    2 | xiaohong |
|    3 | xiaohua  |
|    4 | zhangsan |
|    5 | lisi     |
|    6 | liwu     |
|    7 | liliu9   |
+------+----------+
7 rows in set (0.00 sec)

核心语法详解

第1步:基本字符匹配

目的:了解正则表达式如何实现部分匹配。

  • 对比LIKE:使用`like 'xiao%'`需要借助通配符`%`来匹配前缀。
  • 使用REGEXP:正则表达式会在列值内部自动寻找匹配文本。只要目标字符串中出现该模式,该行即被返回,无需额外指定起始或结束位置。
-- LIKE 需要通配符
select * from regexp_test where name like 'xiao%';
-- 结果:xiaoming, xiaohong, xiaohua

-- REGEXP 直接匹配子串,且不区分大小写
select * from regexp_test where name regexp 'xiao';
-- 结果同上

第2步:实现“或”逻辑(OR)

目的:匹配多个离散的值之一。

在正则表达式中,竖线|表示“或”。这可以替代冗长的`ID = 1 OR ID = 2`写法。

-- 传统写法
select * from regexp_test where id = 1 or id = 2;

-- 正则写法:id字段内容中包含'1'或'2'
select * from regexp_test where id regexp '1|2';
-- 结果:返回id为1和2的记录

第3步:集合匹配与模糊匹配

目的:高效处理连续或离散的字符/数字范围。

  • 方括号[]:用于匹配其中的任意一个字符。例如[128]等价于1|2|8。
  • 连字符-:在方括号内定义范围,如[0-9]匹配任何数字,[a-z]匹配任何小写字母。
-- 匹配id字段中包含1、2或8中的任意数字
select * from regexp_test where id regexp '[128]';
-- 等同于 regexp '1|2|8',但书写更简洁

第4步:特殊字符的转义处理

目的:匹配具有特殊含义的符号(如点号`.`)。

在正则表达式中,.代表“匹配任意单个字符”,若需匹配字面量的点号.,必须进行转义。由于MySQL层和正则引擎层的双重解析,通常需要双反斜杠\\.。

-- 插入一条带点号的数据
insert into regexp_test values(8,'z.y');

-- 错误示范:.会匹配任意字符,导致所有记录被选中
select * from regexp_test where name regexp '.';

-- 正确做法:使用 \\ 对点进行转义
select * from regexp_test where name regexp '\\.';
-- 结果:仅返回 'z.y'

第5步:预定义字符类

目的:快速识别数字、字母或空白符等标准类型。

类名等效表示说明
[:alnum:][a-zA-Z0-9]字母和数字
[:digit:][0-9]任意数字
[:lower:][a-z]小写字母
[:upper:][A-Z]大写字母
[:space:][\f\n\r\t\v]空白字符

第6步:匹配次数控制

目的:指定模式出现的频率。

  • *:0次或多次
  • +:1次或多次
  • ?:0次或1次
  • {n}:确切n次
  • {n,m}:n到m次
-- ? 匹配 xiaoh 后面的 o 出现0次或1次
select * from regexp_test where name regexp 'xiaoh?';
-- 结果:包含 xiaoming(无h), xiaohong(有h), xiaohua(有h)

-- {4} 匹配连续4个字母
select * from regexp_test where name regexp '[a-z]{4}';
-- 结果:所有正常拼音名字均符合

第7步:位置锚点

目的:限定匹配发生的边界(开头、结尾或单词边界)。

  • ^:文本开始
  • $:文本结尾
-- 匹配以数字结尾的名称 (注意:原表第7条 liliu9 符合条件)
select * from regexp_test where name regexp '[a-z][0-9]$';

-- 匹配以数字开头且以数字结尾的模式
select * from regexp_test where name regexp '^[0-9][a-z]*[0-9]$';
-- 结果:1qwr2

总结

通过上述步骤,您已掌握MySQL `REGEXP`的基本用法。从简单的子串查找进阶到利用锚点和量词进行精确定位,能极大提升数据处理效率。建议在实际编写查询时,结合`EXPLAIN`评估性能,因为正则表达式的计算开销通常高于简单的`LIKE`操作。以上就是MySQL正则表达式匹配查询的详细内容,更多关于SQL模糊匹配优化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。