当前位置: 首页 > article >正文

SQL 实战:正则表达式匹配 – 高效数据筛选与文本解析

在实际业务中,我们常常需要对存储在数据库中的文本数据进行复杂筛选和解析。MySQL 提供了强大的正则表达式函数,可以批量筛选出符合或不符合特定规则的文本数据,避免手动筛查的低效方式。

本篇文章将详细介绍如何使用 REGEXPREGEXP_REPLACEREGEXP_LIKE 处理复杂文本匹配需求,通过示例讲解如何高效地筛选手机号、邮箱以及其他格式化文本数据。


一、MySQL 正则表达式函数概览

函数说明示例
REGEXP判断字符串是否匹配正则表达式,返回 1(匹配)或 0(不匹配)WHERE email REGEXP '^[a-z0-9._%+-]+@[a-z0-9.-]+'
REGEXP_LIKE()REGEXP 类似,返回 TRUEFALSEREGEXP_LIKE(phone, '^1[3-9][0-9]{9}$')
REGEXP_REPLACE()使用正则表达式替换字符串REGEXP_REPLACE(phone, '[^0-9]', '')
REGEXP_INSTR()返回正则表达式匹配的起始位置REGEXP_INSTR(email, '@')
REGEXP_SUBSTR()提取匹配正则表达式的子字符串REGEXP_SUBSTR(email, '[a-z0-9._%+-]+')

二、实战案例


案例 1:筛选不符合手机号格式的用户

需求描述
在用户管理系统中,需要筛选出手机号格式不符合规则的用户记录。有效的手机号格式:以 1 开头,第二位为 3-9,并且长度为 11 位。


表结构 users
user_idnamephone
1张三13812345678
2李四15987654321
3王五12345678901
4赵六188-7654-321

SQL 实现
SELECT user_id, name, phone  
FROM users  
WHERE phone NOT REGEXP '^1[3-9][0-9]{9}$';

查询结果
user_idnamephone
3王五12345678901
4赵六188-7654-321

解释

  • 正则表达式解析
    • ^1:以 1 开头。
    • [3-9]:第二位必须是 3-9 之间的数字。
    • [0-9]{9}:后续必须是 9 位数字,总长度正好 11 位。
  • NOT REGEXP 反向筛选出不符合规范的手机号记录。


案例 2:批量清洗手机号格式

需求描述
部分用户手机号中包含空格或 - 分隔符,需要批量清洗手机号,确保只保留数字。


SQL 实现
UPDATE users  
SET phone = REGEXP_REPLACE(phone, '[^0-9]', '')  
WHERE phone REGEXP '[^0-9]';

更新后数据
user_idnamephone
1张三13812345678
2李四15987654321
3王五12345678901
4赵六1887654321

解释

  • REGEXP_REPLACE() 使用正则表达式匹配非数字字符,将其替换为空字符串,实现手机号格式清洗。
  • 匹配 [0-9] 之外的字符,批量去除空格、短横线等分隔符。


案例 3:筛选邮箱格式不正确的用户

需求描述
邮箱地址需要符合标准格式:包含字母、数字、_.,且必须包含 @ 符号和域名后缀。筛选出格式错误的邮箱记录。


表结构 users
user_idnameemail
1张三zhangsan@example.com
2李四lisi@company
3王五wangwu.com
4赵六zhaoliu@example.org

SQL 实现
SELECT user_id, name, email  
FROM users  
WHERE email NOT REGEXP '^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$';

查询结果
user_idnameemail
2李四lisi@company
3王五wangwu.com

解释

  • 正则解析
    • ^ 表示从字符串开始匹配。
    • [a-z0-9._%+-]+ 匹配邮箱前缀(字母、数字和特殊字符)。
    • @ 必须包含 @ 符号。
    • [a-z0-9.-]+ 匹配域名部分。
    • \\. 匹配 .,双斜杠用于转义。
    • [a-z]{2,4} 匹配顶级域名(长度为 2 到 4 个字母)。


案例 4:提取邮箱用户名部分

需求描述
在营销活动中需要提取邮箱地址中 @ 符号之前的用户名部分。


SQL 实现
SELECT user_id, email, REGEXP_SUBSTR(email, '^[^@]+') AS username  
FROM users;

查询结果
user_idemailusername
1zhangsan@example.comzhangsan
2lisi@companylisi
3wangwu.comwangwu.com
4zhaoliu@example.orgzhaoliu

解释

  • REGEXP_SUBSTR() 提取匹配的子字符串。
  • 正则表达式 ^[^@]+ 表示从头部开始匹配,直到遇到 @ 符号为止。


三、优化建议与注意事项

1. 索引优化

在正则表达式匹配中,MySQL 不会自动使用索引,如果数据量大,查询可能较慢。可以在清洗数据后,使用普通索引加速查询。


2. 性能提升建议
  • 使用正则表达式进行复杂筛选时,可在应用层提前过滤,减少对数据库的压力。
  • 定期清洗数据,避免脏数据积累,提升查询和更新效率。

四、总结

  • MySQL 提供了强大的正则表达式函数,可以高效筛选和清洗非结构化文本数据。
  • 常用的 REGEXPREGEXP_REPLACE()REGEXP_LIKE() 可以帮助开发者轻松处理手机号、邮箱和其他文本格式化需求。
  • 通过正则表达式筛选脏数据,有助于提升数据质量,保障系统稳定运行。

http://www.kler.cn/a/460189.html

相关文章:

  • Python实现接口签名调用
  • C++ hashtable
  • STM32--超声波模块(HC—SR04)(标准库+HAL库)
  • 【Java设计模式-1】单例模式,Java世界的“独苗”
  • C# 设计模式(结构型模式):代理模式
  • 微服务面试题:分布式事务和服务监控
  • 数据库-MySQL-sql有in会走索引吗?(易理解)
  • Java包装类型的缓存
  • solr9.7 单机安装教程
  • Uniapp在浏览器拉起导航
  • 自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭
  • (七)- plane/crtc/encoder/connector objects
  • SQL 实战:使用 CTE(公用表达式)优化递归与多层复杂查询
  • Mysql的事务隔离机制
  • 性能与安全测试综合部分
  • 实验八 指针2
  • 常见cms获取Shell漏洞(Wordpress、dedecms、ASPCMS、PhpMyadmin)
  • 深入了解 Zookeeper:原理与应用(选举篇)
  • Supermap iClient Webgl 粒子特效案例-消防场景
  • C++并发:线程管控
  • Android 部分操作(待补充
  • 活动预告 | Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁
  • 代理arp(proxy arp)原理 及配置
  • 每日算法一练:剑指offer——贪心算法与找规律
  • NestJS 认证与授权:JWT、OAuth 和 RBAC 实现
  • 【C++】B2064 斐波那契数列