SQL REGEXP 正则表达式

发布于:2025-04-05 ⋅ 阅读:(28) ⋅ 点赞:(0)

SQL中的正则表达式(通常表示为REGEXP或RLIKE)是一种强大的模式匹配工具,允许你执行复杂的字符串搜索和匹配操作。

基本语法

大多数SQL实现支持以下基本语法

SELECT column_name 
FROM table_name 
WHERE column_name REGEXP 'pattern';

或者使用RLIKE

SELECT column_name 
FROM table_name 
WHERE column_name RLIKE 'pattern';

常用正则表达式元字符

元字符 描述 示例
. 匹配任意单个字符 'a.c' 匹配 "abc", "a c"
^ 匹配字符串开头 '^a' 匹配以a开头的字符串
$ 匹配字符串结尾 'a$' 匹配以a结尾的字符串
* 匹配前一个字符0次或多次 'a*b' 匹配 "b", "ab", "aab"
+ 匹配前一个字符1次或多次 'a+b' 匹配 "ab", "aab"
? 匹配前一个字符0次或1次 'a?b' 匹配 "b", "ab"
[] 匹配括号内的任意一个字符 '[abc]' 匹配 "a", "b" 或 "c"
[^] 不匹配括号内的任意字符 '[^abc]' 匹配非a,b,c的字符
` ` 或操作符 `'a b'` 匹配 "a" 或 "b"
() 分组 '(ab)+' 匹配 "ab", "abab"
{n} 匹配前一个字符恰好n次 'a{2}' 匹配 "aa"
{n,} 匹配前一个字符至少n次 'a{2,}' 匹配 "aa", "aaa"
{n,m} 匹配前一个字符n到m次 'a{2,4}' 匹配 "aa", "aaa", "aaaa"

-- 基本用法
SELECT * FROM users WHERE name REGEXP '^J.*n$';

-- 不区分大小写匹配
SELECT * FROM users WHERE name REGEXP BINARY '^[A-Z]';

-- 替换
SELECT REGEXP_REPLACE(phone, '[^0-9]', '') AS clean_phone FROM customers;

实用示例

验证电子邮件格式

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

提取字符串中的数字

-- MySQL
SELECT REGEXP_SUBSTR(description, '[0-9]+') AS numbers FROM products;

-- PostgreSQL
SELECT (regexp_matches(description, '[0-9]+'))[1] AS numbers FROM products;

查找包含特殊字符的记录

SELECT * FROM comments WHERE content REGEXP '[^a-zA-Z0-9 ]';

匹配特定格式的日期

SELECT * FROM logs WHERE entry_date REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$';

性能考虑

  • 正则表达式通常比简单的LIKE操作更消耗资源

  • 在大型表上使用时应谨慎,考虑添加索引或使用其他过滤条件缩小结果集

  • 某些数据库允许创建基于函数的索引来加速正则表达式查询

正则表达式是SQL中强大的工具,但需要根据具体的数据库系统来调整语法和使用方法


网站公告

今日签到

点亮在社区的每一天
去签到