1. 正则表达式在SQL中的核心价值
第一次在SQL里用正则表达式处理客户地址数据时,我对着几百条"XX省/市/区/县"混搭的字段发愁。直到发现REGEXP函数,原本需要几十行嵌套SUBSTRING的活儿,一句WHERE address REGEXP '^[^省]+省'就搞定了——这就是正则表达式在SQL中的魔力。
作为处理文本的瑞士军刀,正则表达式在SQL中主要解决三类痛点:
- 模糊匹配难题:当LIKE的
%和_无法满足复杂模式时(比如识别所有格式的身份证号) - 数据清洗刚需:从混乱的文本中提取结构化信息(如从日志中分离IP和时间戳)
- 验证约束场景:确保字段符合特定格式(邮箱、URL等)
几乎所有主流数据库都支持正则:
- MySQL的REGEXP/RLIKE
- PostgreSQL的~操作符
- Oracle的REGEXP_LIKE
- SQL Server较新版本也通过CLR集成支持
注意:不同数据库的正则语法可能有细微差异,本文以MySQL 8.0语法为基准,关键差异处会特别说明
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 正则表达式基础语法精要
2.1 元字符速成手册
这些符号是正则表达式的字母表,必须烂熟于心:
sql复制-- 匹配数字开头的字符串
SELECT * FROM products
WHERE product_code REGEXP '^[0-9]';
-- 查找包含连续三个相同字母的单词
SELECT word FROM dictionary
WHERE word REGEXP '([a-z])\\1{2}';
| 元字符 | 作用 | 示例 | 匹配案例 |
|---|---|---|---|
| ^ | 匹配行首 | ^A |
"Apple"中的A |
| $ | 匹配行尾 | end$ |
"The end"的end |
| . | 任意单个字符 | a.c |
"abc", "aXc" |
| * | 前导字符0次或多次 | ab*c |
"ac", "abbc" |
| + | 前导字符1次或多次 | ab+c |
"abc",不匹配"ac" |
| ? | 前导字符0次或1次 | colou?r |
"color", "colour" |
| 精确匹配n次 | a{3} |
"aaa" | |
| 至少匹配n次 | a{2,} |
"aa", "aaaa" | |
| 匹配n到m次 | a{2,4} |
"aa", "aaaa" | |
| [...] | 字符集合 | [aeiou] |
任何元音字母 |
| [^...] | 否定字符集合 | [^0-9] |
任何非数字字符 |
| | | 或运算符 | `cat | dog` |
