简介
**正则表达式(RegEx)**是一个强大的工具,它帮助我们以灵活、动态和高效的方式匹配模式,并根据结果执行操作。
在这个简短的指南中,我们将看看如何用正则表达式来验证Java中的电子邮件地址。
在Java中验证电子邮件地址
验证电子邮件地址并不难--在电子邮件世界中没有太多的多样性,不过,你有几种方法可以去做这件事。
正则表达式具有很强的表现力,所以你可以根据你想验证电子邮件的方式添加越来越多的约束条件,只需添加更多的匹配规则。
通常情况下,你可以把事情归结为一个相当简单的RegEx,它将适合大多数电子邮件地址模式。
你可以不考虑组织类型 (.com,.org,.edu)、主机 (gmail,yahoo,outlook),或电子邮件地址的其他部分,甚至可以强制执行它们。
在接下来的章节中,我们将看看一些不同的正则表达式,以及它们支持或拒绝哪些电子邮件格式。
通用的电子邮件正则表达式
一个通用的电子邮件格式是:
something@host.organizationtype
按照惯例,organizationtype 是3个字符 -edu,org,com, 等等。有相当多的主机,甚至是自定义的主机,所以实际上,这可能是任何字符序列 - 甚至是aaa 。
也就是说,对于相当宽松的验证(但仍然是完全有效的验证),我们可以检查字符串是否包含4组。
- 任何序列的字符 - 名字
@符号- 任何字符序列--主机
- 任何3个字符的字母序列--组织类型
这就为我们提供了一个正则表达式,看起来像。
(.*)(@)(.*)(.[a-z]{3})
为了进一步确保它们完全不包含任何空白,我们可以添加一些\S 检查。
(\S.*\S)(@)(\S.*\S)(.\S[a-z]{3})
也就是说,要在Java中验证一个电子邮件地址,我们可以简单地使用Pattern 和Matcher 类。
String email = "someone@gmail.com";
Pattern pattern = Pattern.compile("(\\S.*\\S)(@)(\\S.*\\S)(.\\S[a-z]{3})");
Matcher matcher = pattern.matcher(email);
if (matcher.matches()) {
System.out.println("Full email: " + matcher.group(0));
System.out.println("Username: " + matcher.group(1));
System.out.println("Hosting Service: " + matcher.group(3));
System.out.println("TLD: " + matcher.group(4));
}
这样做的结果是:
Full email: someone@gmail.com
Username: someone
Hosting Service: gmail
TLD: com
或者,你可以使用字符串类的内置matches() 方法(反正只是使用Pattern 和Matcher )。
String email = "someone@gmail.com";
if(email.matches("(\\S.*\\S)(@)(\\S.*\\S)(.\\S[a-z]{3})")) {
System.out.println(String.format("Email '%s' is valid!", email));
}
其结果是:
Email 'someone@gmail.com' is valid!
棒极了!这个通用的RegEx将处理几乎所有的通用输入,并将检查一封邮件是否遵循所有邮件都遵循的通用形式。
在大多数情况下,这将工作得很好,你不需要比这更多。你将无法用它来检测垃圾邮件,例如。
aaaaa@aaa.aaa
然而,你将强制执行某种形式。
**注意:**要强制执行某些主机或域名,只需将.* 和/或.[a-z]{3} 替换为实际值,如gmail 和.edu 。
强大的电子邮件验证RegEx
一个强大的电子邮件RegEx是什么样子的?有可能--你不会喜欢它,除非你喜欢看正则表达式,这并不是一个特别常见的爱好。
长话短说,这就是它的模样。
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=^_`{|}~-]+)*
|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]
|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
@
(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
|\[(?:(?:(2(5[0-5]|[0-4][0-9])
|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])
|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
- 改编的RegEx bybortzmeyer
这是符合RFC5322标准的正则表达式,涵盖了99.99%的输入电子邮件地址。
用文字来解释它通常是不可行的,但将它可视化会有很大的帮助。

*图片和声明由EmailRegex.com提供。
既然如此,为了在Java中创建一个真正强大的电子邮件验证正则表达式检查器,让我们用这个来代替松散的那个。
String email = "someone@gmail.com";
Pattern pattern = Pattern.compile("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])");
Matcher matcher = pattern.matcher(email);
if (matcher.matches()) {
System.out.println(String.format("Email '%s' is valid!", matcher.group(0)));
}
不用说了--这就可以了。
Email 'someone@gmail.com' is valid!
这并不检查电子邮件是否存在(除非你尝试向该地址发送电子邮件,否则无法检查),所以你总是停留在这种可能性上。当然,即使是这个词组也会注意到奇怪的电子邮件地址,如::
aaaa@aaa.aaa
...是完全有效的
总结
在这个简短的指南中,我们已经看了如何用正则表达式在Java中进行电子邮件验证。
任何形式的验证通常都取决于你的具体项目,但也有一些松散的/通用的形式,你可以执行和匹配。
我们已经建立了一个简单的通用形式,它在大多数情况下都能工作,然后是一个非常强大的正则表达式,如RFC5322所详述的。