专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java邮箱验证方法

Java邮箱验证方法

更新时间:2022-08-05 10:18:13 来源:赢咖4 浏览3071次

Java邮箱验证方法有哪些?赢咖4小编来告诉大家。

Java 中的电子邮件验证

几乎每个有用户注册的应用程序都需要电子邮件验证。

电子邮件地址分为三个主要部分:本地部分、@符号和域。例如,如果“ [email protected] ”是一封电子邮件,那么:

本地部分 = 用户名

@=@

域 = domain.com

通过字符串操作技术验证电子邮件地址可能需要花费大量精力,因为我们通常需要计算和检查所有字符类型和长度。但是在 Java 中,通过使用Java正则表达式,它会容易得多。

众所周知,正则表达式是用于匹配模式的字符序列。在以下部分中,我们将了解如何使用几种不同的正则表达式方法来执行电子邮件验证。

简单的正则表达式验证

验证电子邮件地址的最简单的正则表达式是^(.+)@(\S+) $。

它仅检查电子邮件地址中是否存在@符号。如果存在,则验证结果返回true,否则结果为false。但是,此正则表达式不会检查电子邮件的本地部分和域。

例如,根据这个正则表达式,username @domain.com 将通过验证,但username#domain.com将失败验证。

让我们定义一个简单的辅助方法来匹配正则表达式模式:

public static boolean patternMatches(String emailAddress, String regexPattern) {
    return Pattern.compile(regexPattern)
      .matcher(emailAddress)
      .matches();
}

我们还将编写代码以使用此正则表达式验证电子邮件地址:

@Test
public void testUsingSimpleRegex() {
    emailAddress = "[email protected]";
    regexPattern = "^(.+)@(\\S+)$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

电子邮件地址中缺少@符号也会导致验证失败。

严格的正则表达式验证

现在让我们编写一个更严格的正则表达式来检查本地部分以及电子邮件的域部分:

^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za- z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$

使用此正则表达式在电子邮件地址的本地部分施加以下限制:

它允许从 0 到 9 的数值。

允许从 a 到 z 的大写和小写字母。

允许使用下划线“_”、连字符“-”和点“.”

本地部分的开头和结尾不允许使用点。

不允许使用连续的点。

对于本地部分,最多允许 64 个字符。

此正则表达式中域部分的限制包括:

它允许从 0 到 9 的数值。

我们允许从 a 到 z 的大写和小写字母。

连字符“-”和点“.” 不允许在域部分的开头和结尾。

没有连续的点。

我们还将编写代码来测试这个正则表达式:

@Test
public void testUsingStrictRegex() {
    emailAddress = "[email protected]";
    regexPattern = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@" 
        + "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

因此,通过这种电子邮件验证技术有效的一些电子邮件地址是:

用户名@domain.com

用户名@domain.com

用户名@domain.com

用户名@domain.co.in

用户名@domain.com

以下是通过此电子邮件验证无效的一些电子邮件地址的候选名单:

用户名[email protected]

[email protected]

用户名@domain.com。

用户名@.com

用于验证非拉丁或 Unicode 字符电子邮件的正则表达式

正则表达式适用于用英语编写的电子邮件地址,但不适用于非拉丁语电子邮件地址。

所以我们将编写一个正则表达式,我们也可以使用它来验证 unicode 字符:

^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@[^-][ \\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$

我们可以使用此正则表达式来验证 Unicode 或非拉丁电子邮件地址以支持所有语言。

让我们通过编写测试来检查这个正则表达式:

@Test
public void testUsingUnicodeRegex() {
    emailAddress = "用户名@领域.电脑";
    regexPattern = "^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@" 
        + "[^-][\\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

此正则表达式不仅提供了一种更严格的电子邮件地址验证方法,而且还支持非拉丁字符。

RFC 5322 用于电子邮件验证的正则表达式

我们可以使用 RFC 标准提供的,而不是编写自定义正则表达式来验证电子邮件地址。

RFC 5322是RFC 822的更新版本,为电子邮件验证提供了正则表达式。

让我们来看看:

^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-] +@ [a-zA-Z0-9.-]+$

正如我们所看到的,这是一个非常简单的正则表达式,它允许电子邮件中的所有字符。

但是,它不允许使用竖线字符 (|) 和单引号 ('),因为它们在从客户端站点传递到服务器时存在潜在的SQL 注入风险。

让我们编写代码以使用此正则表达式验证电子邮件:

@Test
public void testUsingRFC5322Regex() {
    emailAddress = "[email protected]";
    regexPattern = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

正则表达式检查顶级域中的字符

我们编写了正则表达式来验证电子邮件地址的本地和域部分。现在我们还将编写一个正则表达式来检查电子邮件的顶级域。

以下正则表达式验证电子邮件地址的顶级域部分:

^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|} ~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$

此正则表达式主要检查电子邮件地址是否只有一个点,以及顶级域中是否存在最少两个和最多六个字符。

我们还将编写一些代码来使用这个正则表达式来验证电子邮件地址:

@Test
public void testTopLevelDomain() {
    emailAddress = "[email protected]";
    regexPattern = "^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*" 
        + "@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

用于限制连续、尾随和前导点的正则表达式

现在让我们编写一个正则表达式来限制电子邮件地址中点的使用:

^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'* +/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$

上面的正则表达式用于限制连续点、前导点和尾随点。因此,一封电子邮件可以包含多个点,但在本地和域部分中不连续。

让我们看一下代码:

@Test
public void testRestrictDots() {
    emailAddress = "[email protected]";
    regexPattern = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@" 
        + "[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

OWASP 验证正则表达式

此正则表达式由OWASP 验证正则表达式存储库提供,用于检查电子邮件验证:

^[a-zA-Z0-9_+&*-] + (?:\\.[a-zA-Z0-9_+&*-] + )*@(?:[a-zA-Z0-9- ]+\\.) + [a-zA-Z]{2, 7}

此正则表达式还支持标准电子邮件结构中的大多数验证。

让我们使用以下代码验证电子邮件地址:

@Test
public void testOwaspValidation() {
    emailAddress = "[email protected]";
    regexPattern = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

Gmail 电子邮件的特殊情况

有一种特殊情况仅适用于 Gmail 域:允许在电子邮件的本地部分使用字符 + 字符。对于 Gmail 域,两个电子邮件地址[email protected][email protected]是相同的。

此外,username @gmail.com类似于[email protected]

我们必须实现一个稍微不同的正则表达式,它也将通过这种特殊情况的电子邮件验证:

^(?=.{1,64}@)[A-Za-z0-9_-+]+(\\.[A-Za-z0-9_-+]+)*@[^-][A- Za-z0-9-+]+(\\.[A-Za-z0-9-+]+)*(\\.[A-Za-z]{2,})$

让我们写一个例子来测试这个用例:

@Test
public void testGmailSpecialCase() {
    emailAddress = "[email protected]";
    regexPattern = "^(?=.{1,64}@)[A-Za-z0-9\\+_-]+(\\.[A-Za-z0-9\\+_-]+)*@" 
        + "[^-][A-Za-z0-9\\+-]+(\\.[A-Za-z0-9\\+-]+)*(\\.[A-Za-z]{2,})$";
    assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}

用于电子邮件的 Apache Commons 验证器

Apache Commons Validator是一个包含标准验证规则的验证包。所以通过导入这个包,我们可以应用电子邮件验证。

我们可以使用EmailValidator类来验证电子邮件,它使用 RFC 822 标准。此验证器包含用于验证电子邮件的自定义代码和正则表达式的混合。它不仅支持特殊字符,还支持我们讨论过的 Unicode 字符。

让我们在项目中添加commons-validator依赖项:

<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>${validator.version}</version>
</dependency>

现在我们可以使用以下代码验证电子邮件地址:

@Test
public void testUsingEmailValidator() {
    emailAddress = "[email protected]";
    assertTrue(EmailValidator.getInstance()
      .isValid(emailAddress));
}

以上就是关于“Java邮箱验证方法”的介绍,大家如果对此比较感兴趣,想了解更多相关知识,可以关注一下赢咖4的Java赢咖4在线学习,里面的课程内容从入门到精通,细致全面,通俗易懂,适合没有基础的小伙伴学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>