首页 > 编程语言 >验证邮件地址的Java正则表达式

验证邮件地址的Java正则表达式

时间:2023-02-06 13:06:41浏览次数:36  
标签:Java String 邮件地址 z0 Za final 正则表达式 com email


最近写了个Java正则表达式来验证RFC 5322规范的邮件地址,这个邮件地址比较复杂,对于这样一个地址:userName@domainName,它满足以下条件:

对于userName

1、允许使用以下所有字符作为用户名:
[A-Z], [a-z], [0-9], [.], [-], [_], [@], [!], [#], [$], [%], [&], [‘], [*], [+], [/], [=], [?], [^], [`], [{], [|], [}], [~]
2、允许使用所有的ASCII字符,包括控制字符,前提条件是这些字符是被[\]所转义的或者被一对[“]所包括起来,比如下边的格式:
” [ ♥”或者\]都是合法的用户名
3、[.]不能出现在用户名的开头或者结尾,也不能连续出现两个以上的[.]

对于domainName

1、只能使用[A-Z],[a-z],[0-9],[-]
2、如果使用了[-],那么该字符不能出现在域名的开头或结尾
3、顶级域名不能全是数字
4、至少要有二级域名

Java正则表达式

由于是用来验证邮件地址的,使用的是matches()这个完全匹配的方法,并且使用非捕获组来提高性能。
写了两个正则表达式,一个是用来验证单个邮件地址的(比如[email protected]);一个是用来验证多个邮件地址的,即多个邮件地址之间用空白符或者英文的逗号或分号分割开来(比如[email protected]; [email protected])。

/** Regex format for multiple EmailValidator */
public static final String MULTIPLE_EMAIL_REGEX_FORMAT = "(?:(?:%1$s)(?:(?:\\s*,\\s*)|(?:\\s*;\\s*)|\\s*$))*";

/** Regex for single EmailValidator */
public static final String SINGLE_EMAIL_REGEX = "(?:(?:[A-Za-z0-9\\-_@!#$%&'*+/=?^`{|}~]|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+(?:\\.(?:(?:[A-Za-z0-9\\-_@!#$%&'*+/=?^`{|}~])|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+)*)@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+(?:(?:[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*)(?:[A-Za-z0-9-]*[A-Za-z0-9])?))";
public static final Pattern SINGLE_EMAIL_REGEX_PATTERN = Pattern.compile(SINGLE_EMAIL_REGEX);

/** Regex for multiple EmailValidator */
public static final String MULTIPLE_EMAIL_REGEX = String.format(MULTIPLE_EMAIL_REGEX_FORMAT, SINGLE_EMAIL_REGEX);
public static final Pattern MULTIPLE_EMAIL_REGEX_PATTERN = Pattern.compile(MULTIPLE_EMAIL_REGEX);

上边验证单个邮件地址的正则表达式太长了,这里分一下行:

public static final String SINGLE_EMAIL_REGEX = "(?:(?:[A-Za-z0-9\\-_@!#$%&'*+/=?
^`{|}~]|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+(?:\\.(?:(?:[A-Za-z0-9\\-
_@!#$%&'*+/=?^`{|}~])|(?:\\\\[\\x00-\\xFF]?)|(?:\"[\\x00-\\xFF]*\"))+)*)
@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+
(?:(?:[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*)(?:[A-Za-z0-9-]*[A-Za-z0-9])?))";

最后附上一些测试用的邮件地址

//        =========TRUE EMAIL==========
final String email = "Abc\\@[email protected]"; //true
// final String email = "Fred\\ [email protected]"; //true
// final String email = "Joe.\\\\[email protected]"; //true
// final String email = "\"Abc@def\"@example.com"; //true
// final String email = "\"Fred Bloggs\"@example.com"; //true
// final String email = "[email protected]"; //true
// final String email = "customer/[email protected]"; //true
// final String email = "[email protected]"; //true
// final String email = "!def!xyz%[email protected]"; //true
// final String email = "[email protected]"; //true
// final String email = "Natasha.O'[email protected]"; //true
// final String email = "[email protected]"; // true
// final String email = "[email protected]"; // true
// final String email = "[email protected] "; // true

// ==========FALSE EMAIL==========
// final String email = "abc[@example.com"; //false
// final String email = "[email protected]"; //false
// final String email = "[email protected]"; // false
// final String email = "[email protected]."; // false
// final String email = "[email protected]"; // false
// final String email = "[email protected]"; // false
// final String email = "[email protected]"; // false
// final String email = "------ab.c@com"; // false
// final String email = "[email protected]"; // false


标签:Java,String,邮件地址,z0,Za,final,正则表达式,com,email
From: https://blog.51cto.com/u_15951177/6038892

相关文章

  • Java反编译工具JD-GUI以及Eclipse的反编译插件
    什么是反编译高级语言源程序经过编译变成可执行文件,反编译就是逆过程。但是通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。反编译是一个复杂的过程,所以越是......
  • 由Java正则表达式的灾难性回溯引发的高CPU异常:java.util.regex.Pattern$Loop.match
    问题与分析某天领导report了一个问题:线上的CPU自从上一个版本迭代后就一直处于居高不下的状况,领导看着这段时间的曲线图判断是有两条线程在不停的死循环。接到任务后去查看......
  • Java下一代高并发技术——虚拟线程“JEP 425: Virtual Threads (Preview)”
    很多语言都有类似于“虚拟线程”的技术,比如Go、C#、Erlang、Lua等,他们称之为“协程”。不管是虚拟线程还是协程,他们都是轻量级线程,其目的都是为了提高并发能力。本节详细......
  • 【Java 数据结构及算法实战】系列 016:HJ2 计算某字符出现次数
    描述写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写,字符串长度小于500。输入描述:第一行输入一个由字......
  • 【Java数据结构及算法实战】系列007:Java队列01——Queue概述
    队列与栈类似,也是一种运算受限的线性表。队列则被限定在表尾进行插入、在表头进行删除,这种数据结构,实现了FIFO(FirstInFirstOut,先进先出)或者是LILO(LastInLastOut,后进后......
  • java注解与反射详解
    一、注解篇1.1、注解的基本概念注解:一种代码级别的说明,它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次;它可以声明在包、类、字段、方法、局部变量......
  • javascript提交示例
    <td>@Html.ActionLink("编辑","Edit",new{id=1})<text>|</text>@Html.ActionLink("删除","Delete",new{id=2})<text>|</text><ahref="javascrip......
  • java中的繁体字/简体字转换
    一、引入pom文件<!--https://mvnrepository.com/artifact/com.spreada/ZHConverter--><dependency><groupId>com.spreada</groupId><artifactId>ZHConverte......
  • Java设计原则
    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。......
  • 7.6提供相同运行环境的Java虚拟机
    除虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。大家说的Java,有两个层面的意思。一个是作为编程语言的Java,另一个是作为程......