MySQL 的 REGEXP 函数是处理复杂字符串匹配的 “瑞士军刀”,掌握它能大幅提升数据筛选效率。
一、基础扫盲:先搞懂 “是什么”
1. 什么是正则表达式?
用一句话解释:正则表达式是一套用于描述字符串模式的规则,通过特殊符号(元字符)定义匹配逻辑,比如 “匹配以字母开头、数字结尾的字符串”。
2. MySQL 中 REGEXP 的用法
- 基础语法:
column REGEXP 'pattern'(返回 1 表示匹配,0 表示不匹配)。 - 举例:
SELECT * FROM users WHERE email REGEXP '@gmail\\.com$';(匹配 gmail 邮箱,注意.需要转义)。 - 与 LIKE 的核心区别:
| 特性 | LIKE | REGEXP |
|---|---|---|
| 匹配方式 | 仅支持%(任意字符)和_(单个字符) | 支持元字符(^、$、*等),功能更灵活 |
| 部分匹配 | 需用%pattern%实现 | 默认就是部分匹配(无需通配符) |
| 转义符 | 依赖数据库设置 | 统一用\\转义(如\\.匹配小数点) |
三、核心语法:元字符与示例(重中之重)
| 元字符 | 作用 | MySQL 示例(匹配目标) |
|---|---|---|
^ | 匹配字符串开头 | '^abc' → 匹配 “abc123”“abcdef” |
$ | 匹配字符串结尾 | 'xyz$' → 匹配 “123xyz”“xxyz” |
. | 匹配任意单个字符(除换行) | 'a.c' → 匹配 “abc”“a1c”“a#c” |
* | 匹配前一个字符 0 次或多次 | 'ab*c' → 匹配 “ac”“abc”“abbbbc” |
+ | 匹配前一个字符 1 次或多次 | 'ab+c' → 匹配 “abc”“abbbbc”(不匹配 “ac”) |
? | 匹配前一个字符 0 次或 1 次 | 'ab?c' → 匹配 “ac”“abc”(不匹配 “abbc”) |
[ ] | 匹配括号内任意单个字符 | '[0-9]' → 匹配任意数字;'[a-zA-Z]'匹配字母 |
[^ ] | 匹配不在括号内的任意字符 | '[^0-9]' → 匹配非数字字符 |
{n} | 匹配前一个字符恰好 n 次 | 'a{3}' → 匹配 “aaa” |
{n,} | 匹配前一个字符至少 n 次 | 'a{2,}' → 匹配 “aa”“aaa” 等 |
{n,m} | 匹配前一个字符 n 到 m 次 | 'a{1,3}' → 匹配 “a”“aa”“aaa” |
注意:MySQL 的 REGEXP 默认不区分大小写,若需区分,可使用REGEXP BINARY,例如'abc' REGEXP BINARY 'ABC'返回 0(不匹配)。
四、实战案例:用 REGEXP 解决实际问题
这部分是博客的 “灵魂”,结合具体场景展示用法,读者可直接复用:
1. 验证格式合法性
- 匹配手机号(以 1 开头,11 位数字):
SELECT * FROM user WHERE phone REGEXP '^1[3-9][0-9]{9}$'; - 匹配邮箱(含 @和域名后缀):
SELECT * FROM user WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
2. 筛选包含特定模式的字符串
- 提取包含数字的用户名:
SELECT username FROM user WHERE username REGEXP '[0-9]'; - 排除包含特殊字符(如!、@)的记录:
SELECT * FROM user WHERE username NOT REGEXP '[!@#$%]';
3. 替换或清洗数据(结合 REGEXP_REPLACE)
MySQL 8.0 及以上支持REGEXP_REPLACE,例如清除字符串中的所有空格:
SELECT REGEXP_REPLACE(address, ' ', '') AS clean_address FROM user;
五、避坑指南:这些 “坑” 别踩
- 转义符的坑:MySQL 中需用
\\转义(而非标准正则的\),例如匹配小数点需写\\.,否则.会被解释为 “任意字符”。 - 性能问题:REGEXP 匹配会全表扫描(无法使用索引),避免在大数据量表中用复杂正则,可先通过 WHERE 条件缩小范围。
- 版本差异:低版本 MySQL(如 5.7)不支持
{n,m}、?等元字符,需用*或+替代;MySQL 8.0 新增对正则捕获组的支持(REGEXP_SUBSTR)。 - 部分匹配的 “陷阱”:
column REGEXP 'abc'会匹配 “abc”“xabc”“abcx”,若需精确匹配整个字符串,需加^和$(如'^abc$')。
六、进阶:REGEXP 与其他函数结合
REGEXP_INSTR:返回匹配内容在字符串中的位置,例如REGEXP_INSTR('abc123', '[0-9]')返回 4(第一个数字的位置)。REGEXP_SUBSTR:提取匹配的子串,例如REGEXP_SUBSTR('电话:13800138000', '[0-9]{11}')返回 “13800138000”。
七、总结:REGEXP 学习路径
- 记住常用元字符(
^$.*[]是基础); - 先在测试库用简单案例练习(如匹配数字、字母);
- 复杂场景分步骤拆解(如邮箱验证可拆分为 “用户名 +@+ 域名 + 后缀”);
- 善用 MySQL 官方文档(点击查看)查询版本特性。
一句话收尾:REGEXP 是 MySQL 字符串处理的 “进阶技能”,看似复杂,实则掌握规律后能大幅提升效率 —— 从今天开始,告别繁琐的 LIKE 嵌套吧!
3358

被折叠的 条评论
为什么被折叠?



