.NET Core中简单的邮箱格式校验方式

目录
  • Intro
  • Implement
  • More
  • References
  • 总结

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

总结

到此这篇关于.NET Core中简单的邮箱格式校验方式的文章就介绍到这了,更多相关.NET Core邮箱格式校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JS 正则表达式验证密码、邮箱格式的实例代码

    遗憾的是博客内容不允许包含js代码,不能在线测试,就只上代码了 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Regular Expression test</title> </head> <body> 用户名:(4-16位,字母.下划线.数字,减号) <br/> <input type="

  • 在js中实现邮箱格式的验证方法(推荐)

    如下所示: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>在此处插入标题</title> <script typ

  • jQuery简单实现验证邮箱格式

    在表单提交的时候可能需要用到邮箱验证代码,代码比较简单,就是邮箱格式的判断,如果说有难点可能就是关于正则表达式的使用,这里就不多说了,大家可以自行查询,下面就给出一段可以使用的验证代码,复制黏贴即可. 代码实例如下: <script type="text/javascript" src="mytest/jQuery/jquery-1.8.3.js"></script> <script type="text/javascript

  • JavaScript简单验证表单空值及邮箱格式的方法

    本文实例讲述了JavaScript简单验证表单空值及邮箱格式的方法.分享给大家供大家参考,具体如下: 运行效果图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <meta http-equiv="

  • JS验证邮箱格式是否正确的代码

    复制代码 代码如下: /* *验证邮箱格式是否正确 *参数strEmail,需要验证的邮箱 */ function chkEmail(strEmail) { if (!/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(strEmail)) { return false; } else { return true; } }

  • .NET Core中简单的邮箱格式校验方式

    目录 Intro Implement More References 总结 Intro 前段时间有一个验证邮箱格式的小需求,然后突然发现了一种非常简单的邮箱格式判断方式 Implement 直接来看实现 public static bool IsEmailAddress(string email) {     if (string.IsNullOrWhiteSpace(email))         return false;     var symbolIndex = email.IndexO

  • SpringBoot中@Pattern注解对时间格式校验方式

    目录 SpringBoot @Pattern注解对时间格式校验 1.需求背景 2.实现案例 @Pattern的用法 下面是常用的正则表达式 SpringBoot @Pattern注解对时间格式校验 1.需求背景 有一个需求,在前端传过来的时间格式的字符串进行校验,是否符合"yyyy-MM-dd HH:mm:ss",在SpringBoot中当然可以用@Datetimeformat注解来进行验证,但字段的属性得用Date类型,由于我的项目中该字段用了String类型,需要对类型进行转换不太

  • 详解ASP.NET Core中配置监听URLs的五种方式

    默认情况下,ASP. NET Core应用会监听一下2个Url: http://localhost:5000 https://localhost:5001 在本篇博文中,我将展示如何使用五种不同的方式改变应用监听的URLs. 在ASP.NET Core项目启动时,有多种配置监听Url的方式,在我之前的一篇博客中,已经展示了在ASP.NET Core 1.0中如何应用不同的方式配置,在ASP.NET Core 3.x中,大部分方式还是一样的. UseUrls() - 在Program.cs配置程序

  • .NET Core中本地化机制的深入讲解

    前言 ASP.NET Core中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化. ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化. 在.NET Core 2.0以上版本, Microsoft.AspNetCore.Localization已经包含在了Microsoft.AspNetCore.All中,所以我们并不需要手动引入其他的类库. 创建一个MVC网站 为了测试ASP.NET Core的本地化,我们首先在V

  • Hangfire在ASP.NET CORE中的简单实现方法

    hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNetCore hangfire的任务需要数据库持久化,我们在Startup类中修改ConfigureServices 然后在Configure方法中启用hangfire中间件 现在我们运行一下项目,可以看到,数据库里自动生成了很多表,这些表就是用来持久化任务的 我们打开如下地址,可以看到hangfir

  • 在django中图片上传的格式校验及大小方法

    如下所示: Uploadfiles = request.FILES.get('参数', '') for i in Uploadfiles : # 图片大小的属性 i.size suffix = os.path.splitext(i.name)[1] if not suffix: return False elif suffix.lower() == '.jpeg' or suffix.lower() == ".png" or suffix.lower() == ".jpg&q

  • Asp.net core中RedisMQ的简单应用实现

    最近一个外部的项目,使用到了消息队列,本来是用rabbitmq实现的,但是由于是部署到别人家的服务器上,想尽量简化一些,项目中本来也要接入了redis缓存,就尝试使用redis来实现简单的消息队列. 使用redis做消息队列有两种方法,一种是使用pub/sub,另一种是使用list结构,配合brpop来消费.这两种方式各有特点,这里简述一下: pub/sub模式,支持多客户端消费,但是不支持持久化,这就意味着客户端断开的时间内发布的消息将会全部舍弃掉. list配合brpop,默认不支持多客户端

随机推荐