MYSQL中的REGEXP

MySQL 的 REGEXP 函数是处理复杂字符串匹配的 “瑞士军刀”,掌握它能大幅提升数据筛选效率。

一、基础扫盲:先搞懂 “是什么”

1. 什么是正则表达式?

用一句话解释:正则表达式是一套用于描述字符串模式的规则,通过特殊符号(元字符)定义匹配逻辑,比如 “匹配以字母开头、数字结尾的字符串”。

2. MySQL 中 REGEXP 的用法
  • 基础语法:column REGEXP 'pattern'(返回 1 表示匹配,0 表示不匹配)。
  • 举例:SELECT * FROM users WHERE email REGEXP '@gmail\\.com$';(匹配 gmail 邮箱,注意.需要转义)。
  • 与 LIKE 的核心区别:

特性LIKEREGEXP
匹配方式仅支持%(任意字符)和_(单个字符)支持元字符(^$*等),功能更灵活
部分匹配需用%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;

五、避坑指南:这些 “坑” 别踩

  1. 转义符的坑:MySQL 中需用\\转义(而非标准正则的\),例如匹配小数点需写\\.,否则.会被解释为 “任意字符”。
  2. 性能问题:REGEXP 匹配会全表扫描(无法使用索引),避免在大数据量表中用复杂正则,可先通过 WHERE 条件缩小范围。
  3. 版本差异:低版本 MySQL(如 5.7)不支持{n,m}?等元字符,需用*+替代;MySQL 8.0 新增对正则捕获组的支持(REGEXP_SUBSTR)。
  4. 部分匹配的 “陷阱”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 学习路径

  1. 记住常用元字符(^$.*[]是基础);
  2. 先在测试库用简单案例练习(如匹配数字、字母);
  3. 复杂场景分步骤拆解(如邮箱验证可拆分为 “用户名 +@+ 域名 + 后缀”);
  4. 善用 MySQL 官方文档(点击查看)查询版本特性。

一句话收尾:REGEXP 是 MySQL 字符串处理的 “进阶技能”,看似复杂,实则掌握规律后能大幅提升效率 —— 从今天开始,告别繁琐的 LIKE 嵌套吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值