MySQL 正则表达式笔记
·

👨💻 关于作者:会编程的土豆
“不是因为看见希望才坚持,而是坚持了才看见希望。”
你好,我是会编程的土豆,一名热爱后端技术的Java学习者。
📚 正在更新中的专栏:
-
《数据结构与算法》😊😊😊
-
《leetcode hot 100》🥰🥰🥰🤩🤩🤩
-
《数据库mysql》
💕作者简介:后端学习者
在日常开发中,我们经常需要做“模糊但有规则”的匹配,比如:
-
查找手机号格式是否正确
-
判断邮箱是否合法
-
从文本中提取特定字段
-
清洗脏数据
这时候,普通的 LIKE 已经不够用了,就需要用到 正则表达式(REGEXP)
本文带你从 0 到掌握 MySQL 正则表达式,用最直接的方式讲清楚,避免绕弯
一、什么是正则表达式
正则表达式(Regular Expression)本质就是一套字符串匹配规则
你可以把它理解为: “用一种特殊语法,去描述字符串长什么样”
比如:
-
^a:以 a 开头 -
b$:以 b 结尾 -
[0-9]:任意一个数字
二、MySQL 中的正则用法
MySQL 提供了两种方式:
1. REGEXP(常用)
SELECT * FROM 表名 WHERE 字段 REGEXP '正则表达式';
2. NOT REGEXP
SELECT * FROM 表名 WHERE 字段 NOT REGEXP '正则表达式';
三、基础语法
1. 单字符匹配
'a' REGEXP 'a' -- true
2. 点号(.)
. 表示任意单个字符
SELECT 'abc' REGEXP 'a.c'; -- true
3. 字符集合 []
[abc] 表示 a 或 b 或 c
SELECT 'a' REGEXP '[abc]'; -- true
SELECT 'd' REGEXP '[abc]'; -- false
4. 范围匹配
[a-z] 小写字母
[A-Z] 大写字母
[0-9] 数字
SELECT 'g' REGEXP '[a-z]'; -- true
5. 取反
[^abc] 表示不是 a、b、c
SELECT 'd' REGEXP '[^abc]'; -- true
四、定位符(非常重要)
1. ^ 开头
SELECT 'abc' REGEXP '^a'; -- true
2. $ 结尾
SELECT 'abc' REGEXP 'c$'; -- true
3. 完整匹配
^...$ 表示整个字符串必须符合
SELECT 'abc' REGEXP '^abc$'; -- true
SELECT 'abcd' REGEXP '^abc$'; -- false
五、重复匹配(核心)
1. *
* 表示前一个字符出现 0 次或多次
SELECT 'aaa' REGEXP 'a*'; -- true
2. +
+ 表示至少 1 次
SELECT 'a' REGEXP 'a+'; -- true
SELECT '' REGEXP 'a+'; -- false
3. ?
? 表示 0 或 1 次
4. {n}
a{3} 表示 aaa
SELECT 'aaa' REGEXP 'a{3}'; -- true
5. {n,m}
a{2,4} 表示 2 到 4 次
六、实战
1. 判断手机号(中国大陆)
SELECT '13812345678' REGEXP '^1[3-9][0-9]{9}$';
2. 判断邮箱
SELECT 'test@qq.com' REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
3. 只包含数字
SELECT '12345' REGEXP '^[0-9]+$';
4. 包含中文
SELECT '你好' REGEXP '[\x{4e00}-\x{9fa5}]';
5. 查找包含数字的记录
SELECT * FROM user WHERE name REGEXP '[0-9]';
6. 查找以字母开头
SELECT * FROM user WHERE name REGEXP '^[A-Za-z]';
七、MySQL 8.0 新增函数
MySQL 8.0 提供了更强的正则函数:
1. REGEXP_LIKE
SELECT REGEXP_LIKE('abc', '^a');
2. REGEXP_REPLACE
SELECT REGEXP_REPLACE('abc123', '[0-9]', '');
结果:abc
3. REGEXP_SUBSTR
SELECT REGEXP_SUBSTR('abc123xyz', '[0-9]+');
结果:123
4. REGEXP_INSTR
SELECT REGEXP_INSTR('abc123', '[0-9]');
返回位置
八、和 LIKE 的区别
| 对比项 | LIKE | REGEXP |
|---|---|---|
| 模糊能力 | 弱 | 强 |
| 语法 | % _ | 正则 |
| 性能 | 较好 | 较差 |
| 复杂匹配 | 不支持 | 支持 |
结论:
-
简单查询 → 用 LIKE
-
复杂规则 → 用 REGEXP
九、性能注意事项
-
正则表达式不会走索引
-
大数据量下性能较差
-
尽量:
先用 WHERE 缩小范围,再用 REGEXP
十、总结
MySQL 正则表达式,本质就是三件事:
-
描述字符串规则
-
用 REGEXP 匹配
-
用函数做提取/替换
重点掌握:
-
^ $(边界) -
[ ](范围) -
* + {}(次数) -
MySQL 8 的四个函数
更多推荐




所有评论(0)