在MySQL的查询场景中,除了常规的等值匹配、LIKE模糊匹配之外,正则表达式能提供更灵活的字符串匹配能力,适合处理规则复杂的字符串筛选需求。MySQL通过REGEXP关键字支持正则表达式匹配,不需要额外配置就能直接使用。

MySQL正则表达式基础语法
MySQL中使用正则表达式的核心关键字是REGEXP,它的基本语法结构如下:
-- 基础语法格式 SELECT 列名 FROM 表名 WHERE 列名 REGEXP '正则表达式规则';
和LIKE关键字不同,REGEXP默认是部分匹配,只要目标字符串中包含符合正则规则的内容就会返回对应记录,不需要像LIKE那样加%通配符来实现部分匹配。
常见正则匹配规则示例
1. 匹配特定字符
如果需要查询某个字段中包含指定字符的记录,直接用字符本身作为正则规则即可:
-- 查询user表中name字段包含字母a的记录 SELECT id, name FROM user WHERE name REGEXP 'a';
2. 匹配字符集合
使用中括号[]可以定义匹配的字符集合,只要目标字符串中包含集合中的任意一个字符就会匹配成功:
-- 查询user表中name字段包含a、b、c任意一个字母的记录 SELECT id, name FROM user WHERE name REGEXP '[abc]';
如果要匹配某个范围的字符,可以用连字符-,比如[0-9]匹配所有数字,[a-z]匹配所有小写字母:
-- 查询user表中phone字段包含数字0到5的记录 SELECT id, phone FROM user WHERE phone REGEXP '[0-5]';
3. 匹配开头和结尾
用^可以匹配字符串的开头,用$可以匹配字符串的结尾:
-- 查询user表中name字段以a开头的记录 SELECT id, name FROM user WHERE name REGEXP '^a'; -- 查询user表中name字段以c结尾的记录 SELECT id, name FROM user WHERE name REGEXP 'c$';
4. 匹配重复次数
可以用量词来定义字符的重复匹配规则,常见的量词有:
*:匹配前面的字符0次或多次+:匹配前面的字符1次或多次?:匹配前面的字符0次或1次{n}:匹配前面的字符恰好n次{n,m}:匹配前面的字符至少n次,最多m次
示例代码如下:
-- 查询user表中name字段包含至少1个连续a的记录
SELECT id, name FROM user WHERE name REGEXP 'a+';
-- 查询user表中name字段包含3到5个连续数字的记录
SELECT id, name FROM user WHERE name REGEXP '[0-9]{3,5}';
REGEXP和LIKE的区别
很多开发者会混淆REGEXP和LIKE的使用场景,两者的核心区别如下:
| 对比项 | LIKE | REGEXP |
|---|---|---|
| 匹配模式 | 简单通配符匹配,仅支持%和_ | 完整正则表达式匹配,支持复杂规则 |
| 匹配逻辑 | 默认全字符串匹配,需要加%实现部分匹配 | 默认部分匹配,包含符合规则的内容即返回 |
| 适用场景 | 简单模糊查询,比如前缀、后缀匹配 | 复杂规则匹配,比如多条件、范围、重复次数匹配 |
注意事项
使用MySQL正则表达式时需要注意,正则规则默认是不区分大小写的,如果需要区分大小写,可以使用REGEXP BINARY关键字:
-- 查询user表中name字段包含大写字母A的记录,区分大小写 SELECT id, name FROM user WHERE name REGEXP BINARY 'A';
另外如果正则规则中包含特殊字符,比如.、*等,需要用反斜杠进行转义,比如要匹配包含.的字符串,正则规则需要写成\.:
-- 查询user表中email字段包含.的记录 SELECT id, email FROM user WHERE email REGEXP '\.';