简单的邮箱格式校验方式

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

以上是关于简单的邮箱格式校验方式的主要内容,如果未能解决你的问题,请参考以下文章

AJAX的简单示例:注册校验

text 校验邮箱格式

Java正则表达式校验QQ号码和邮箱地址格式

JavaScript的常用工具方法大全持续更新中...

JavaScript的常用工具方法大全持续更新中...

springboot使用hibernate validator校验方式