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

使用SQL正则(RegEX)结合LIKE运算符校验邮箱的问题排查

原SQL错误排查

你的语句全部返回无效结果,核心问题有4个:

  • 运算符使用错误:标准SQL的LIKE仅支持%(匹配任意长度任意字符)、_(匹配单个任意字符)两个通配符,不支持正则表达式语法,直接把正则规则写在LIKE后无法匹配任何符合正则的内容。
  • 正则规则和需求反向:你写的允许字符集[A-Za-z0-9._%\-+!#$&/=?^|~],把要求禁止的_、-、+、&、=都纳入了允许范围,完全不符合过滤要求。
  • 基础语法错误:SELECT EmailAddress后缺少逗号,语句本身存在语法问题。
  • 规则覆盖不全:没有实现长度校验,也没有覆盖符号不相邻、符号不在首尾、单.必须在@后等边界规则。
正确实现方案

注意:正则匹配不能用LIKE实现,需要使用对应数据库的正则匹配函数:MySQL/MariaDB用REGEXP、PostgreSQL用~运算符、Oracle用REGEXP_LIKE、SQL Server 2017+用REGEXP_MATCHES。长度判断直接用内置长度函数实现,可读性和兼容性远好于正则写长度限制。

以下代码完全覆盖你列出的所有校验规则,以MySQL语法为例:

SELECT 
  EmailAddress,
  CASE 
    WHEN 
      -- 校验总长度至少6个字符
      CHAR_LENGTH(EmailAddress) >= 6
      -- 正则匹配所有格式规则
      AND EmailAddress REGEXP '^[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)+$'
    THEN 'Valid'
    ELSE 'INVALID' 
  END AS valid_email
FROM `Database`
WHERE EmailAddress IS NOT NULL;

正则规则对应说明

使用的正则^[A-Za-z0-9]+(\.[A-Za-z0-9]+)*@[A-Za-z0-9]+(\.[A-Za-z0-9]+)+$(不同数据库按需调整转义符)可以覆盖所有格式要求:

  • 仅包含1个@:正则中仅存在1个@,前后均为非@字符,直接排除多@情况
  • 至少包含1个.:@后强制要求至少1组.+字母数字的组合,保证全串至少1个.
  • 单.必须在@后:@前的部分允许0个.,如果全串只有1个.则必然出现在@后;如果@前有.则全串.数量≥2,符合规则要求
  • .和@不相邻:@前后的字符段都要求以字母数字开头/结尾,不会出现.@或@.的相邻组合
  • 符号不在首尾:正则强制开头、结尾必须为字母/数字,直接排除./@在首尾的情况
  • 禁止特殊字符:正则允许的字符仅包含大小写字母、数字、.、@,要求过滤的=、_、-、+、&、<、>、,均不在允许字符集内,会被直接判定为无效。

如果使用PostgreSQL,只需要把正则部分的双反斜杠改成单反斜杠即可,即'^[A-Za-z0-9]+(\.[A-Za-z0-9]+)*@[A-Za-z0-9]+(\.[A-Za-z0-9]+)+$',其余逻辑完全一致。

内容的提问来源于stack exchange,提问作者Shubham Vajpayee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:51:21