基本语法

SELECT 列名 FROM 表名 WHERE 列名 REGEXP '正则表达式';

 

常用元字符

元字符说明示例匹配示例
^匹配开头'^J'John, Jane
$匹配结尾'y$'Lily, Henry
.匹配任意单个字符'b.t'bit, bat, but
*匹配前一个字符0次或多次'ab*c'ac, abc, abbc
+匹配前一个字符1次或多次'ab+c'abc, abbc
?匹配前一个字符0次或1次'ab?c'ac, abc
|或操作符'an|en'and, end
[...]字符集合'[aeiou]'a, e, i, o, u
[^...]否定字符集合'[^0-9]'非数字字符
{n}精确匹配n次'a{2}'aa
{n,}至少匹配n次'a{2,}'aa, aaa
{n,m}匹配n到m次'a{2,4}'aa, aaa, aaaa


实际应用示例

1. 匹配开头和结尾

匹配以J开头的名字:

SELECT * FROM students WHERE name REGEXP '^J';

匹配以n结尾的名字:

SELECT * FROM students WHERE name REGEXP 'n$';


2. 通配符匹配

匹配包含a和y且中间有一个字符的名字:

SELECT * FROM students WHERE name REGEXP 'a.y';


3. 重复匹配

匹配包含连续两个e的名字:

SELECT * FROM students WHERE name REGEXP 'e{2}';

匹配包含1-3个i的名字:

SELECT * FROM students WHERE name REGEXP 'i{1,3}';


4. 字符集合

匹配包含元音字母的名字:

SELECT * FROM students WHERE name REGEXP '[aeiou]';

匹配不包含数字的名字:

SELECT * FROM students WHERE name REGEXP '[^0-9]';


5. 或操作

匹配包含an或en的名字:

SELECT * FROM students WHERE name REGEXP 'an|en';

 

6. 转义特殊字符

匹配包含点号的名字:

SELECT * FROM users WHERE username REGEXP '\\.';


高级技巧

1. 匹配特定模式

匹配电子邮件格式:

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

 

匹配手机号码:

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


2. 结合其他SQL功能

统计匹配正则的记录数:

SELECT COUNT(*) FROM products WHERE description REGEXP 'premium|deluxe';


更新匹配正则的记录:

UPDATE articles SET status = 'reviewed' WHERE content REGEXP '\\[
需要引用\\]';


性能注意事项

1. 正则表达式通常比简单的LIKE查询更耗资源

2. 避免在大型表上使用复杂的正则表达式

3. 考虑为常用模式创建计算列并建立索引

4. 简单的模式匹配优先使用LIKE

 

与LIKE的区别

 

特性REGEXPLIKE
功能完整正则表达式支持简单模式匹配
通配符丰富元字符%_
性能相对较慢相对较快
大小写敏感取决于排序规则 (collation)取决于排序规则 (collation)


点赞(2)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)