暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

详解 SQL 正则表达式 (REGEXP)

源话编程 2024-09-24
488

👋 热爱编程的小伙伴们,欢迎来到我的编程技术分享公众号!在这里,我会分享编程技巧、实战经验、技术干货,还有各种有趣的编程话题!

正则表达式(Regular Expression, 简称 Regex 或 RegExp)是用于匹配字符串模式的强大工具。在 SQL 中,正则表达式主要用于字符串的检索和匹配。通过正则表达式,我们可以实现更复杂和灵活的查询,特别是在数据清洗和复杂数据查询场景中。

本文将详细讲解 SQL 中正则表达式的使用,包括基本的语法规则、常见匹配模式,并结合 MySQL 的具体实现进行代码示例说明。

1. 正则表达式简介

正则表达式是一种字符串匹配的模式,可以用来查找、替换、验证字符串。虽然每个数据库对正则表达式的支持程度不同,但 MySQL 提供了相对完善的正则表达式支持,使用 REGEXP
RLIKE
关键字来实现正则匹配。

2. MySQL 中的正则表达式函数

MySQL 中常用的正则表达式相关函数有两个:

  • REGEXP
    :用于匹配正则表达式,等同于 RLIKE
  • NOT REGEXP
    :匹配不符合正则表达式的字符串。

基本语法:

SELECT column_name
FROM table_name
WHERE column_name REGEXP 'pattern';

  • pattern
    :要匹配的正则表达式模式。
  • REGEXP
    会返回布尔值,匹配返回 1
    ,不匹配返回 0

例如,查询名字中包含字母 "a" 的数据:

SELECT name 
FROM users 
WHERE name REGEXP 'a';

3. 常用正则表达式语法

3.1 基本字符匹配

  • **.
    **:匹配任意单个字符。
  • **[abc]
    **:匹配集合中的任意一个字符。
  • **[^abc]
    **:匹配不在集合中的任意字符。
  • **^
    **:匹配字符串的开头。
  • **$
    **:匹配字符串的结尾。

3.2 字符集匹配

  • **[0-9]
    **:匹配任意数字。
  • **[a-z]
    **:匹配任意小写字母。
  • **[A-Z]
    **:匹配任意大写字母。

3.3 字符类匹配

  • **\d
    **:匹配任意数字,等同于 [0-9]
  • **\w
    **:匹配字母、数字和下划线,等同于 [a-zA-Z0-9_]
  • **\s
    **:匹配空白字符(空格、制表符等)。

3.4 边界匹配

  • **^
    **:匹配字符串开头。
  • **$
    **:匹配字符串结尾。

3.5 重复匹配

  • ***
    **:匹配前面的字符 0 次或多次。
  • **+
    **:匹配前面的字符 1 次或多次。
  • **?
    **:匹配前面的字符 0 次或 1 次。
  • **{n}
    **:匹配前面的字符恰好 n 次。
  • **{n,}
    **:匹配前面的字符至少 n 次。
  • **{n,m}
    **:匹配前面的字符至少 n 次,但不超过 m 次。

4. 示例讲解

4.1 基本字符匹配

查找所有名字中包含字符 "a" 的用户:

SELECT name
FROM users
WHERE name REGEXP 'a';

  • 解释:正则表达式 a
    表示匹配包含 "a" 的所有名字。

4.2 字符集匹配

查找名字中包含任意数字的用户:

SELECT name
FROM users
WHERE name REGEXP '[0-9]';

  • 解释[0-9]
    表示匹配名字中含有数字的记录。

4.3 边界匹配

查找以字母 "A" 开头的名字:

SELECT name
FROM users
WHERE name REGEXP '^A';

  • 解释^A
    表示匹配以 "A" 开头的名字。

4.4 重复匹配

查找名字中含有至少两个连续 "o" 字母的用户:

SELECT name
FROM users
WHERE name REGEXP 'o{2,}';

  • 解释o{2,}
    表示匹配包含至少两个连续 "o" 字符的名字。

5. 实战示例:使用正则表达式进行数据筛选

示例 1:匹配电子邮件地址

要从用户表中查找所有合法的电子邮件地址,可以使用如下的正则表达式:

SELECT email
FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';

  • 解释:此正则表达式匹配标准的电子邮件格式,确保邮箱地址以字母或数字开头,中间包含 "@",最后是域名。

示例 2:匹配手机号(中国大陆)

筛选出格式为 11 位的手机号:

SELECT phone
FROM users
WHERE phone REGEXP '^1[3-9][0-9]{9}$';

  • 解释:正则表达式 ^1[3-9][0-9]{9}$
    用于匹配中国大陆的手机号,1
    开头,第二位为 3-9
    之间的数字,且总长度为 11 位。

示例 3:匹配身份证号

要筛选出有效的 18 位身份证号码:

SELECT id_card
FROM users
WHERE id_card REGEXP '^[1-9][0-9]{5}(18|19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[0-9]{3}[0-9Xx]$';

  • 解释:该正则表达式确保身份证号是 18 位,且日期部分为合法日期。

结语

正则表达式是 SQL 中非常强大的工具,尤其在字符串匹配和数据清洗过程中能够发挥极大的作用。通过本文的介绍,你应该能够掌握 MySQL 中正则表达式的基本用法,并能灵活应用到实际项目中。正则表达式的学习是一个循序渐进的过程,建议多实践和尝试,以便熟练掌握其强大之处。


个人观点,仅供参考,非常感谢各位朋友们的支持与关注

如果你觉得这个作品对你有帮助,请不吝点赞在看,分享给身边更多的朋友。如果你有任何疑问或建议,欢迎在评论区留言交流。


文章转载自源话编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论