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 characterbool 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

简单的邮箱格式校验方式相关推荐

  1. 临时邮箱怎么注册?单次群发500的邮箱格式怎么写是正确的?

    临时邮箱有哪些?临时邮箱好用吗?为什么要注册临时邮箱?注册某些网站某些APP时需要填写邮箱,注册企业邮箱时也需要填写邮箱-邮箱格式怎么填写是正确是? 临时邮箱可以在不是自己电脑或者网吧紧急处理工作.哪 ...

  2. QQ空间及邮箱验证码登录的校验方式及自动登录的解决方案

    目前有很多的SNS社区或类SNS的网站,例如开心.51.校内等,但是发现大多数社区在邀请好友的时候都没有提供对QQ邮箱或者QQ空间好友列表获取的功能,不过似乎海内支持,但是网上相关QQ的文章还不是很多 ...

  3. Java基础——正则表达式_校验QQ号码、手机号是否满足规则、邮箱格式验证

    有以下案例: 1 需求:校验qq号码.要求必须是5-15位数:0不能开头:非正则表达式实现:正则表达式实现 package com.xawl.demo;import java.util.Scanner ...

  4. 外贸邮箱的格式是什么样的?邮箱的注册方式有哪些?

    2020年一场突如其来的疫情打乱了我们所有人的生活节奏,改变了我们的生活方式,不少企业承受不住压力导致破产,同时又有一个新的机会摆在我们的面前. 大学同学小刚之前所在的公司本来发展很好,但是因为疫情他 ...

  5. 表单校验方式(手机号,固定电话,邮箱,营业执照,银行卡号)

    最近在做后台的用户信息整理,要用到一些表单校验,在之前没有处理过营业执照这种的表单校验,正好借此机会整理一下,欢迎大佬们提出宝贵意见. 表单引入: <FormItem label="联 ...

  6. linux邮箱格式正则表达式,【深入浅出Linux】常用正则表达式校验

    前言 使用man grep查看grep的帮助文档,有如下内容: image 可以看出,正则表达式由三类,分别是 基本的正则表达式(Basic Regular Expression 又叫 Basic R ...

  7. js手机格式校验+隐藏手机号中间四位,变成*星号 || 身份证生日四位变*,邮箱*号显示

    //手机号格式校验 if (/^1[3456789]\d{9}$/.test(phonenum)) { //判断手机号 console.log(手机号正确); } //手机号中间四位用" * ...

  8. js邮箱+手机 格式校验

    ①邮箱格式验证 Function validateEmail(){ Var email=ajaxform.getColumnValue("email"); //邮箱用户名可为a-z ...

  9. js luhn算法_判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...

最新文章

  1. ADPRL - 近似动态规划和强化学习 - Note 3 - Stochastic Infinite Horizon Problem
  2. OFDM专题之子载波间干扰问题(一)
  3. visual studio过期登录不了账户_具有最高管理权限账户,Windows 7设置Administrator密码永不过期...
  4. kodi资源_kodi.tv让你从此看4K节目可以更多选择
  5. C++11 多线程 线程管理基础
  6. 解决系统性能问题:线程增加导致堆增加
  7. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_12_创建多线程程序的第二种方式_实现Runnable接口...
  8. LeCo-238. 除自身以外数组的乘积
  9. Spring Cloud 异常“ Caused by: java.net.UnknownHostException: discovery.host ”
  10. 双粗虚线中间一条实线_中间实线两边虚线是变道吗
  11. 【zz北邮人】[经历][完稿]cs硕士妹子找工作经历【阿里人搜等互联网】
  12. Excel下载附件工具类
  13. css预处理器Less
  14. Django实战(9)——为人脸识别系统添加随机抽签功能
  15. C语言 有a个学生,每个学生有b门课程的成绩。输入学生的序号后输出对应的全部成绩
  16. Python 遍历获得目录下的所有文件路径
  17. 微软OA认证/ADFS认证 java 源码解析
  18. linux echo服务,在Linux中禁用echo服务
  19. Zend Framework教程-Zend_Db-数据库概述
  20. 除了背后拆台,东方农嫂还犯了这三个致命错误 | 商业评论

热门文章

  1. python求15 17 23 65 97的因数_笨方法学python,Lesson15,16,17
  2. 【USACO 2020 January Silver】Loan Repayment 题解
  3. GDUT_排位赛题解报告_第3场_B.Loan Repayment
  4. 移动Web第七天(响应式网页:媒体查询、BootStrap)
  5. iphone连电脑服务器未响应,今天要闻iphone8无限转圈黑屏强制关机没反应(苹果电脑开不了机黑屏)...
  6. java web ip_详解Java Web如何限制访问的IP的两种方法
  7. 模型误差、观测误差、截断误差(或称方法误差)、舍入误差
  8. linux 时区文件的规则,linux – 如何将POSIX时间转换为Olson时区文件...
  9. 乾坤物联-UWB定位基站和定位信标的区别
  10. rem适配布局 Less基础 插件 cssrem