SQL 中的正则表达式

正则表达式

正则表达式(Regular Expression,简称 Regex 或 Regexp)是一种用于匹配字符串中字符组合的模式。它们在文本处理、数据验证和搜索操作中非常有用。以下是一些常见的正则表达式及其用途:

一. 常见的正则表达式

1. 字符类

字符类用于匹配特定的字符集合。

  • .:匹配任何单个字符(除换行符外)。

    • 示例:a.b 匹配 a 后面跟着任何字符,再跟着 b,如 a1ba-b
  • [abc]:匹配方括号内的任意一个字符。

    • 示例:[abc] 匹配 abc
  • [^abc]:匹配不在方括号内的任意一个字符。

    • 示例:[^abc] 匹配除 abc 之外的任何字符。
  • [a-z]:匹配指定范围内的任意一个字符。

    • 示例:[a-z] 匹配任何小写字母。
  • [A-Z]:匹配任何大写字母。

    • 示例:[A-Z] 匹配任何大写字母。
  • [0-9]:匹配任何数字。

    • 示例:[0-9] 匹配任何单个数字。

2. 预定义字符类

预定义字符类是一些常用的字符类的简写形式。

  • \d:匹配任何数字,等价于 [0-9]

    • 示例:\d 匹配任何单个数字。
  • \D:匹配任何非数字字符,等价于 [^0-9]

    • 示例:\D 匹配任何非数字字符。
  • \s:匹配任何空白字符,包括空格、制表符、换行符等。

    • 示例:\s 匹配任何空白字符。
  • \S:匹配任何非空白字符。

    • 示例:\S 匹配任何非空白字符。
  • \w:匹配任何字母数字字符,等价于 [a-zA-Z0-9_]

    • 示例:\w 匹配任何字母数字字符或下划线。
  • \W:匹配任何非字母数字字符。

    • 示例:\W 匹配任何非字母数字字符。

3. 边界匹配

边界匹配用于匹配字符串的开始或结束位置。

  • ^:匹配字符串的开始位置。

    • 示例:^abc 匹配以 abc 开头的字符串。
  • $:匹配字符串的结束位置。

    • 示例:abc$ 匹配以 abc 结尾的字符串。
  • \b:匹配单词边界。

    • 示例:\bword\b 匹配完整的单词 word,而不是 word 的子字符串。

4. 量词

量词用于指定前面的字符或字符类可以出现的次数。

  • *:匹配前面的字符或字符类 0 次或多次。

    • 示例:a* 匹配 0 个或多个 a,如 aaaaaa 或空字符串。
  • +:匹配前面的字符或字符类 1 次或多次。

    • 示例:a+ 匹配 1 个或多个 a,如 aaaaaa,但不匹配空字符串。
  • ?:匹配前面的字符或字符类 0 次或 1 次。

    • 示例:a? 匹配 0 个或 1 个 a,如 a 或空字符串。
  • {n}:匹配前面的字符或字符类恰好 n 次。

    • 示例:a{3} 匹配恰好 3 个 a,如 aaa
  • {n,}:匹配前面的字符或字符类至少 n 次。

    • 示例:a{3,} 匹配 3 个或更多 a,如 aaaaaaa
  • {n,m}:匹配前面的字符或字符类至少 n 次,但不超过 m 次。

    • 示例:a{2,4} 匹配 2 到 4 个 a,如 aaaaaaaaa

5. 分组和捕获

分组和捕获用于将正则表达式的一部分分组,并捕获匹配的内容。

  • ():分组和捕获。

    • 示例:(abc) 匹配 abc,并捕获匹配的内容。
  • (?:...):非捕获分组。

    • 示例:(?:abc) 匹配 abc,但不捕获匹配的内容。

6. 选择

选择用于匹配多个模式中的一个。

  • |:选择。
    • 示例:abc|def 匹配 abcdef

7. 贪婪和非贪婪

量词的贪婪和非贪婪模式决定了匹配的长度。

  • 贪婪模式:默认情况下,量词是贪婪的,尽可能多地匹配字符。

    • 示例:a+ 匹配尽可能多的 a
  • 非贪婪模式:在量词后加 ?,使其变为非贪婪模式,尽可能少地匹配字符。

    • 示例:a+? 匹配尽可能少的 a

8. 断言

断言用于指定匹配的条件,但不消耗字符。

  • 前瞻断言

    • 正前瞻(?=...),匹配后面跟着指定模式的字符。
      • 示例:abc(?=def) 匹配 abc,但只有在其后面跟着 def 时才匹配。
    • 负前瞻(?!...),匹配后面不跟着指定模式的字符。
      • 示例:abc(?!def) 匹配 abc,但只有在其后面不跟着 def 时才匹配。
  • 后顾断言

    • 正后顾(?<=...),匹配前面跟着指定模式的字符。
      • 示例:(?<=abc)def 匹配 def,但只有在其前面跟着 abc 时才匹配。
    • 负后顾(?<!...),匹配前面不跟着指定模式的字符。
      • 示例:(?<!abc)def 匹配 def,但只有在其前面不跟着 abc 时才匹配。

示例

假设有一个字符串 123abc456def789,我们想匹配其中的数字和字母组合。

  • 匹配数字:\d+

    • 匹配结果:123456789
  • 匹配字母:[a-z]+

    • 匹配结果:abcdef
  • 匹配数字和字母组合:\d+[a-z]+

    • 匹配结果:123abc456def

二. 使用语法

在 MySQL 中,可以使用 REGEXPRLIKE 操作符来使用正则表达式。

语法:

REGEXP
SELECT column1, column2 
FROM table_name 
WHERE column1 REGEXP 'pattern';
RLIKE
SELECT column1, column2, ...
FROM table_name
WHERE column_name RLIKE 'pattern';

三. 使用 LIKE 和正则表达式的区别

  • LIKE 操作符

    • 适用于简单的模式匹配,支持 %_ 两个通配符。
    • 性能较好,适用于大多数简单的文本匹配需求。
  • 正则表达式

    • 适用于复杂的模式匹配,支持更广泛的模式匹配功能。
    • 性能可能稍差,但在处理复杂模式时非常强大。

示例

假设有一个 employees 表,包含以下数据:

employee_id first_name last_name salary department_id
1 Alice Smith 60000 101
2 Bob Johnson 70000 101
3 Charlie Brown NULL 102
4 David Davis 80000 102
5 Eve White 90000 103

假设我们想查询名字以字母 "A" 开头,且名字长度为 5 个字符的员工。使用 LIKE 操作符可以这样写:

SELECT * 
FROM employees
WHERE first_name LIKE 'A____';

结果:

employee_id first_name last_name salary department_id
1 Alice Smith 60000 101

使用正则表达式可以这样写:

SELECT * 
FROM employees
WHERE first_name REGEXP '^A.{4}$';

结果:

employee_id first_name last_name salary department_id
1 Alice Smith 60000 101

总结

  • LIKE 操作符:适用于简单的模式匹配,支持 %_ 通配符,性能较好。
  • 正则表达式:适用于复杂的模式匹配,支持更广泛的模式匹配功能,但性能可能稍差。
全部评论

相关推荐

三七互娱面经:&nbsp;&nbsp;&nbsp;&nbsp;三人围攻(二人视频聊,最后还有一个用电话在视频里面聊)&nbsp;自我介绍,有没有offer?为什么不去?为什么选择我们公司?&nbsp;问项目。发现问的是旧项目,然后就自己说了一下新项目。项目的小细节,数据处理方面&nbsp;逻辑回归的数学思想&nbsp;有一个场景,想用朴素贝叶斯,但效果不好,怎么优化?&nbsp;逻辑回归采用的是交叉熵,那你知道相对熵(KL)吗?逻辑回归为什么不用最小二乘?信息熵公式,说说联合熵的公式&nbsp;xgb二阶泰勒展开,为什么不三阶?&nbsp;xgb的优点是什么?&nbsp;CART树和ID3区别?ID3的缺点?ID3换成基尼系数是否就没有这个缺点了?CART回归树和ID3是二叉树还是多叉树?&nbsp;平时有什么爱好?读什么书?&nbsp;和领导的意见不一致怎么办?&nbsp;发现领导的想法是错的?你会怎么做?&nbsp;&nbsp;面了40分钟,获益良多。技术深度还不够,继续努力吧~设计岗位还有HC!设计岗位还有HC!三七互娱2025届春季校园招聘正式启动啦,~投递简历通过会就有在线测评,大家一定要认真对待哈。简要介绍A股优秀综合型文娱上市公司、中国游戏厂商出海第一梯队、国家文化产业示范基地招聘岗位【游戏策划】【美术设计】【市场推广】【游戏运营类】【技术开发】▶内推码投递,简历优先筛选:DSpqRPZJ内推链接:https://app.mokahr.com/m/campus_apply/37/58016?recommendCode=DSpqRPZJ&amp;amp;amp;hash=%23%2Fjobs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大家投递完可以在评论区打上姓名缩写+岗位,我来确认有没有内推成功喽 #校招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推码#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#秋招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务