基本语法
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的区别
特性 | REGEXP | LIKE |
---|---|---|
功能 | 完整正则表达式支持 | 简单模式匹配 |
通配符 | 丰富元字符 | % , _ |
性能 | 相对较慢 | 相对较快 |
大小写敏感 | 取决于排序规则 (collation) | 取决于排序规则 (collation) |
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程