You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测邮箱@后含两个及以上点?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:10:27