# 使用 Java 正则表达式进行电子邮件验证

> 原文： [https://howtodoinjava.com/regex/java-regex-validate-email-address/](https://howtodoinjava.com/regex/java-regex-validate-email-address/)

**使用[正则表达式](https://howtodoinjava.com/java-regular-expression-tutorials/)的电子邮件验证**是常见的任务，在任何将电子邮件地址作为注册信息中所需信息的应用程序中都可能需要。 可能会有更多用例，但这里不再讨论。

让我们直接进入主要讨论，即*使用正则表达式验证 Java* 中的电子邮件。

## 1\. 验证电子邮件的最简单的正则表达式

> **正则表达式：`^(.+)@(.+)$`**

这是最简单的，只关心`@`符号。 在`@`符号前后，可以有任意数量的字符。 让我们看一个简单的例子，了解我的意思。

```java
List emails = new ArrayList();
emails.add("user@domain.com");
emails.add("user@domain.co.in");
emails.add("user1@domain.com");
emails.add("user.name@domain.com");
emails.add("user#@domain.co.in");
emails.add("user@domaincom");

//Invalid emails
emails.add("user#domain.com");
emails.add("@yahoo.com");

String regex = "^(.+)@(.+)$";

Pattern pattern = Pattern.compile(regex);

for(String email : emails){
	Matcher matcher = pattern.matcher(email);
	System.out.println(email +" : "+ matcher.matches());
}

```

程序输出。

```java
user@domain.com : 		true
user@domain.co.in : 	true
user1@domain.com : 		true
user.name@domain.com : 	true
user#@domain.co.in : 	true
user@domaincom : 		true

user#domain.com : 		false
@yahoo.com : 			false

```

Common lang 的[**`EmailValidator`**](https://commons.apache.org/proper/commons-validator/apidocs/org/apache/commons/validator/routines/EmailValidator.html "EmailValidator")类中提供了此模式。 因此，如果您需要它，您可以直接使用此类。

## 2\. 对用户名添加限制部分

> **正则表达式：`^[A-Za-z0-9+_.-]+@(.+)$`**

在此正则表达式中，我们在电子邮件地址的用户名部分添加了一些限制。 上述正则表达式的限制为：

1）允许使用`A-Z`字符

2）允许使用`a-z`字符

3）允许使用`0-9`数字

4）另外，电子邮件中只能包含点（`.`），破折号（`-`）和下划线（`_`）

5）其余所有字符均不允许

让我们根据上述正则表达式测试一些电子邮件地址。

```java
List emails = new ArrayList();
emails.add("user@domain.com");
emails.add("user@domain.co.in");
emails.add("user1@domain.com");
emails.add("user.name@domain.com");
emails.add("user_name@domain.co.in");
emails.add("user-name@domain.co.in");
emails.add("user@domaincom");

//Invalid emails
emails.add("@yahoo.com");

String regex = "^[A-Za-z0-9+_.-]+@(.+)$";

Pattern pattern = Pattern.compile(regex);

for(String email : emails){
	Matcher matcher = pattern.matcher(email);
	System.out.println(email +" : "+ matcher.matches());
}

```

程序输出：

```java
user@domain.com : 			true
user@domain.co.in : 		true
user1@domain.com : 			true
user.name@domain.com : 		true
user_name@domain.co.in : 	true
user-name@domain.co.in : 	true
user@domaincom : 			true

@yahoo.com : 				false

```

请注意，类似的限制也可以适用于域名部分。 然后正则表达式将变成这样。

```java
^[A-Z0-9+_.-]+@[A-Z0-9.-]+$
```

## 3\. RFC 5322 允许的 Java 电子邮件验证

> **正则表达式：``^[a-zA-Z0-9_!#$%&’*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$``**

此正则表达式示例使用 **RFC 5322** 允许的所有字符，这些字符控制电子邮件格式。 如果允许的字符中有一些，如果直接从用户输入传递到 SQL 语句，则会带来安全风险，例如单引号（`'`）和管道字符（`|`）。

在将电子邮件地址插入传递给另一个程序的字符串中时，应确保转义敏感字符，以防止诸如 *SQL 注入*攻击之类的安全漏洞。

```java
List emails = new ArrayList();
emails.add("user@domain.com");
emails.add("user@domain.co.in");
emails.add("user.name@domain.com");
emails.add("user?name@domain.co.in");
emails.add("user'name@domain.co.in");

//Invalid emails
emails.add("@yahoo.com");

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

Pattern pattern = Pattern.compile(regex);

for(String email : emails){
	Matcher matcher = pattern.matcher(email);
	System.out.println(email +" : "+ matcher.matches());
}

```

程序输出：

```java
user@domain.com : 			true
user@domain.co.in : 		true
user.name@domain.com : 		true
user?name@domain.co.in : 	true
user'name@domain.co.in : 	true
@yahoo.com : 				false

```

## 4\. 限制电子邮件中的前导，尾随或连续点的正则表达式

> **正则表达式：``^[a-zA-Z0-9_!#$%&’*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&’*+/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$``**

本地部分和域名都可以包含一个或多个点，但是两个点之间不能紧挨出现。 此外，本地部分和域名中的第一个和最后一个字符不得为点号：

```java
List emails = new ArrayList();
emails.add("user@domain.com");
emails.add("user@domain.co.in");
emails.add("user.name@domain.com");
emails.add("user'name@domain.co.in");

//Invalid emails
emails.add(".username@yahoo.com");
emails.add("username@yahoo.com.");
emails.add("username@yahoo..com");

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

Pattern pattern = Pattern.compile(regex);

for(String email : emails){
	Matcher matcher = pattern.matcher(email);
	System.out.println(email +" : "+ matcher.matches());
}

```

程序输出：

```java
user@domain.com : 			true
user@domain.co.in : 		true
user.name@domain.com : 		true
user'name@domain.co.in : 	true

.username@yahoo.com : 		false
username@yahoo.com. : 		false
username@yahoo..com : 		false

```

## 5\. 限制顶级域中的字符数的正则表达式（推荐）

现在，让我们修改正则表达式，以使域名必须至少包含一个点，并且域名中最后一个点之后的部分只能由字母组成。

假设域名类似于`secondlevel.com`或`thirdlevel.secondlevel.com`。顶级域（在这些示例中为`.com`）必须仅包含 2 至 6 个字母。

> **正则表达式：``^[\\w!#$%&’*+/=?`{|}~^-]+(?:\\.[\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$``**

```java
List emails = new ArrayList();
emails.add("user@domain.com");
emails.add("user@domain.co.in");
emails.add("user.name@domain.com");
emails.add("user_name@domain.com");
emails.add("username@yahoo.corporate.in");

//Invalid emails
emails.add(".username@yahoo.com");
emails.add("username@yahoo.com.");
emails.add("username@yahoo..com");
emails.add("username@yahoo.c");
emails.add("username@yahoo.corporate");

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

Pattern pattern = Pattern.compile(regex);

for(String email : emails){
	Matcher matcher = pattern.matcher(email);
	System.out.println(email +" : "+ matcher.matches());
}

```

程序输出：

```java
user@domain.com : 				true
user@domain.co.in : 			true
user.name@domain.com : 			true
user_name@domain.com : 			true
username@yahoo.corporate.in : 	true

.username@yahoo.com : 			false
username@yahoo.com. : 			false
username@yahoo..com : 			false
username@yahoo.c : 				false
username@yahoo.corporate : 		false

```

最后一个正则表达式是我对 Java 中的**简单电子邮件验证的建议**。 请注意，可以在 Java 中不使用正则表达式进行电子邮件验证，但不建议这样做。 在需要处理模式的任何地方，正则表达式都是您的朋友。

请随时使用此正则表达式并根据您的应用程序的其他需求对其进行编辑。

学习愉快！

**参考：** [http://www.rfc-editor.org/rfc/rfc5322.txt](https://www.rfc-editor.org/rfc/rfc5322.txt)