EF Code First中逗号分隔邮箱正则验证失效 求可用正则表达式
问题背景
采用Entity Framework Code First开发模式时,需要对模型类中存储逗号分隔多个邮箱地址的字符串属性做格式校验,原有正则校验逻辑存在兼容性问题:
- 部分输入场景下校验可正常通过
- 其余合法输入场景下校验误判失效
原有数据注解校验代码如下:
[RegularExpression(@"^(\s?[^\s,]+@[^\s,]+\.[^\s,]+\s?,)*(\s?[^\s,]+@[^\s,]+\.[^\s,]+)$",ErrorMessage = "Invalid Email")] [DisplayName("Participant List")] public string ParticipantList { get; set; }
问题原因
原有正则存在以下设计缺陷,导致场景适配不全:
- 仅允许逗号、邮箱前后出现最多1个空白字符,逗号/邮箱前后存在多个空格、制表符时会直接匹配失败
- 未允许字段首尾、最后一个邮箱后的尾随空白,用户输入不小心带末尾空格时会校验失败
- 邮箱格式匹配规则过于宽松,会放过大量不符合邮箱规范的非法输入
可用方案
方案1:直接替换兼容正则
替换原有正则表达式即可覆盖绝大多数常规输入场景,支持逗号前后任意数量空白、首尾空白、单个/多个合法邮箱输入:
[RegularExpression(@"^\s*([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\s*(,\s*[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\s*)*)$", ErrorMessage = "Invalid Email")] [DisplayName("Participant List")] public string ParticipantList { get; set; }
注:纯正则实现无法100%覆盖所有合法邮箱格式,存在少量误判可能。
方案2:自定义校验特性(推荐)
复用.NET内置的EmailAddressAttribute做单邮箱校验,稳定性远高于手写正则,还可以精准定位非法邮箱条目:
public class CommaSeparatedEmailAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value == null || string.IsNullOrWhiteSpace(value.ToString())) return ValidationResult.Success; var emailList = value.ToString() .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var emailValidator = new EmailAddressAttribute(); var invalidEntries = emailList.Where(email => !emailValidator.IsValid(email)).ToList(); return invalidEntries.Any() ? new ValidationResult(ErrorMessage ?? "存在格式非法的邮箱地址") : ValidationResult.Success; } }
使用时直接替换原有正则注解即可:
[CommaSeparatedEmail(ErrorMessage = "Invalid Email")] [DisplayName("Participant List")] public string ParticipantList { get; set; }
内容的提问来源于stack exchange,提问作者Thishan Dharmakeerthi
相关产品推荐
相关产品推荐

