如何检测邮箱@后含两个及以上点?SQL正则验证(Oracle/PostgreSQL)
邮箱正则验证与SQL实现方案
原正则的问题分析
你给出的正则 [A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z] 无法正确匹配包含多段域名的合法邮箱,比如你举例的test@test1.test2.com。问题出在最后一段规则:
[.][A-Za-z]强制顶级域名只能是单个字母,但实际顶级域名(如com、cn、org)都是2个及以上字符,导致合法邮箱会被判定为非法。
修正后的正则表达式
调整顶级域名的匹配规则,同时限定整个字符串的首尾(避免匹配文本中的邮箱片段),修正后的正则如下:
^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
规则说明:
^和$限定匹配整个字符串,防止误判包含邮箱片段的文本[A-Za-z0-9._%-]+匹配用户名部分,覆盖常见的合法字符[A-Za-z0-9.-]+允许@后出现多段带点的域名(如test1.test2)\.[A-Za-z]{2,}匹配顶级域名,要求至少2个字母,符合实际域名规则
Oracle 中的SQL实现
Oracle使用 REGEXP_LIKE 函数做正则匹配,示例如下:
验证单个邮箱
SELECT CASE WHEN REGEXP_LIKE('test@test1.test2.com', '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$', 'i') THEN '合法邮箱' ELSE '非法邮箱' END AS 验证结果 FROM DUAL;
'i'参数表示忽略大小写,符合邮箱不区分大小写的特性
批量验证表中邮箱字段
假设表名为 user_info,邮箱字段为 email:
SELECT email, CASE WHEN REGEXP_LIKE(email, '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$', 'i') THEN '合法' ELSE '非法' END AS 邮箱状态 FROM user_info;
PostgreSQL 中的SQL实现
PostgreSQL使用 ~* 操作符(忽略大小写的正则匹配),示例如下:
验证单个邮箱
SELECT CASE WHEN 'test@test1.test2.com' ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN '合法邮箱' ELSE '非法邮箱' END AS 验证结果;
批量验证表中邮箱字段
假设表名为 user_info,邮箱字段为 email:
SELECT email, CASE WHEN email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN '合法' ELSE '非法' END AS 邮箱状态 FROM user_info;
补充说明
这个正则是针对常见业务场景的简化实现,如果你需要支持更复杂的邮箱规则(比如含特殊字符的用户名、国际化域名),可以进一步调整规则,但对于大多数常规业务需求,上述方案已经足够使用。
内容的提问来源于stack exchange,提问作者code 7
相关产品推荐
相关产品推荐

