简单的邮箱格式校验方式
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的邮箱格式校验方式相关的知识,希望对你有一定的参考价值。
简单的邮箱格式校验方式
Intro
前段时间有一个验证邮箱格式的小需求,然后突然发现了一种非常简单的邮箱格式判断方式
Implement
直接来看实现
public static bool IsEmailAddress(string email)
if (string.IsNullOrWhiteSpace(email))
return false;
var symbolIndex = email.IndexOf('@');
return symbolIndex > 0
&& symbolIndex < email.Length - 1
&& symbolIndex == email.LastIndexOf('@');
在之前的认知里,一般判断邮箱格式都是用一个正则表达式,有时候正则表达式还可能会特别复杂,在老的 .NET framework 中 EmailAddress
的判断使用的是一个很复杂的一个正则表达式
const string pattern = @"^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`\\|~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`\\|~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$";
可以参考:https://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/EmailAddressAttribute.cs,54
而在 .NET Core 中就比较简单了,没有用到正则,前面的实现也是来自于 .NET Core EmailAddressAttribute
的实现,实现如下:
public sealed class EmailAddressAttribute : DataTypeAttribute
public EmailAddressAttribute()
: base(DataType.EmailAddress)
// Set DefaultErrorMessage not ErrrorMessage, allowing user to set
// ErrorMessageResourceType and ErrorMessageResourceName to use localized messages.
DefaultErrorMessage = SR.EmailAddressAttribute_Invalid;
public override bool IsValid(object value)
if (value == null)
return true;
if (!(value is string valueAsString))
return false;
// only return true if there is only 1 '@' character
// and it is neither the first nor the last character
bool found = false;
for (int i = 0; i < valueAsString.Length; i++)
if (valueAsString[i] == '@')
if (found || i == 0 || i == valueAsString.Length - 1)
return false;
found = true;
return found;
通过这种方式,我们可以提高判断邮箱格式的性能又不必维护正则表达式了。总结:有且仅有一个@并且前后都有字符
More
有一点需要注意,在上面的 EmailAddressAttribute
的实现中,如果值是 null
也会认为是“合法”的,这里的“合法”并不是说邮箱格式合法而是说验证可以通过,实际情况下一般我们是会认为这并不是一个合法的邮箱
References
https://github.com/dotnet/runtime/blob/main/src/libraries/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/EmailAddressAttribute.cs
https://github.com/dotnet/runtime/blob/v5.0.0/src/libraries/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/EmailAddressAttribute.cs
https://github.com/dotnet/corefx/blob/v3.0.0/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/EmailAddressAttribute.cs
https://github.com/dotnet/corefx/blob/v2.2.0/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/EmailAddressAttribute.cs
https://github.com/dotnet/corefx/blob/v2.0.0/src/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/EmailAddressAttribute.cs
以上是关于简单的邮箱格式校验方式的主要内容,如果未能解决你的问题,请参考以下文章