如何用正则筛选含非标准字符的sales表email_address记录?
正确SQL解决方案
问题分析
原SQL语句存在几个核心错误:
- 正则匹配逻辑错误:
!~ '^[xxx]'仅判断字符串不以指定字符开头,而非检查是否包含非法字符; - 错误排除合规记录:
AND email_addr !~ '[[alphanum]]'会剔除所有含字母数字的记录,而合规邮箱必然包含这类字符; - 字符范围不全:未覆盖带重音的Unicode字母(如
á),且漏了允许的特殊字符~和'。
正确SQL语句
SELECT * FROM db.sales WHERE email_address ~ '[^\p{L}\p{N}~!@#$%^&*()_\-+={}\[\]|:";\'<>,.?/]';
语句说明
- 字符集定义:
\p{L}:匹配所有Unicode字母(包括带重音、波浪线的大小写字符,如á、ñ);\p{N}:匹配所有数字;- 后续列出需求中允许的所有特殊字符,注意对正则特殊符号(如
-、])进行转义。
- 匹配逻辑:
- 字符集前加
^表示取反,整个正则的意思是:字符串中存在任意一个字符不属于允许的范围(即包含表情、数学符号等非标准字符)。
- 字符集前加
验证案例
- 合规记录(不会被筛选):
<testemail123@email.me、'email@email.com、ábc@123.com; - 非法记录(会被筛选):
test😀@email.com(含表情)、test∑@email.com(含数学符号)。
内容的提问来源于stack exchange,提问作者wcbrown
相关产品推荐
相关产品推荐

