Java 中不使用正则表达式的电子邮件验证
Email validation in Java without using regular expression
我知道使用 Regex 验证电子邮件只需要 3-4 行代码。但是,我正在寻找验证电子邮件 without using
Regex.
在某种程度上,代码成功地通过了几乎所有然而,验证仍然无法弄清楚 - 如何避免特殊字符成为电子邮件地址的第一个和最后一个字符。
特殊字符列表= {'!', '#', '$', '%', '^', '&', '*', '(', ')', '-', '/', '~', '[', ']'} ;
我正在看的是:
If the username section (abc.xyz
@gmail.com) starts or ends with
any of the special characters, it should trigger an "Invalid email
address" error. The same goes with domain section as well.
例如... 下面的 email-IDs 列表应该打印一个 "Invalid email ID" error message
#abc.xyz@gmail.com
abc.xyz&@gmail.com
abc.xyz&@!gmail.com
abc.xyz&@gmail.com!
import java.util.Scanner;
public class Email_Validation {
public static void main(String[] args) {
// User-input code
Scanner scan = new Scanner(System.in);
System.out.println("Enter your email address");
String email = scan.next();
// Code to check if email ends with '.' (period sign)
boolean checkEndDot = false;
checkEndDot = email.endsWith(".");
// Code to find out last index of '@' sign
int indexOfAt = email.indexOf('@');
int lastIndexOfAt = email.lastIndexOf('.');
//Code to check occurence of @ in the email address
int countOfAt = 0;
for (int i = 0; i < email.length(); i++) {
if(email.charAt(i)=='@')
countOfAt++; }
// Code to check occurence of [period sign i..e, "."] after @
String buffering = email.substring(email.indexOf('@')+1, email.length());
int len = buffering.length();
int countOfDotAfterAt = 0;
for (int i=0; i < len; i++) {
if(buffering.charAt(i)=='.')
countOfDotAfterAt++; }
// Code to print userName & domainName
String userName = email.substring(0, email.indexOf('@'));
String domainName = email.substring(email.indexOf('@')+1, email.length());
System.out.println("\n");
if ((countOfAt==1) && (userName.endsWith(".")==false) && (countOfDotAfterAt ==1) &&
((indexOfAt+3) <= (lastIndexOfAt) && !checkEndDot)) {
System.out.println("\"Valid email address\"");}
else {
System.out.println("\n\"Invalid email address\""); }
System.out.println("\n");
System.out.println("User name: " +userName+ "\n" + "Domain name: " +domainName);
}
}
如何解决这个问题?
所以,看一下字符串 API。
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
具体来说,您有 String.length() 和 String.charAt()。因此,您可以非常非常轻松地从 String 中获取第一个和最后一个字符。您已经在您的代码中完成了这一点;假设你已经得到它。
您可以 运行 通过此处的长 if 语句;
char first = email.charAt(0);
if (first == '!' || first == '#' || <more here>) {
return false;
}
但这可能会让人头疼。另一种方法是使用 Set,如果您需要多次检查,这种方法效率更高。 (查找 HashSet 通常非常快。)您只需创建一次集合,然后就可以多次使用它,例如 Set.contains(first)。
这个怎么样:
public class EmailMe {
private static Set<Character> bad = new HashSet<>();
public static void main(String[] args) {
char[] specialChars = new char[] {'!', '#', '$', '%', '^', '&', '*', '(', ')', '-', '/', '~', '[', ']'} ;
for (char c : specialChars) {
bad.add(c);
}
check("#abc.xyz@gmail.com");
check("abc.xyz&@gmail.com");
check("abc.xyz&@!gmail.com");
check("abc.xyz&@gmail.com!");
}
public static void check(String email) {
String name = email.substring(0, email.indexOf('@'));
String domain = email.substring(email.indexOf('@')+1, email.length());
// String[] split = email.split("@");
checkAgain(name);
checkAgain(domain);
}
public static void checkAgain(String part) {
if (bad.contains(part.charAt(0))) System.out.println("bad start:"+part);
if (bad.contains(part.charAt(part.length()-1))) System.out.println("bad end:"+part);
}
}
我使用 Apache Commons 库中的 EmailValidator。
上面的例子,
String email = "anEmailAddress@domain.com";
EmailValidator validator = EmailValidator.getInstance();
if (!validator.isValid(email)) {
// The email is not valid.
}
或
if (!EmailValidator.getInstance().isValid("anEmailAddress@domain.com")) {
// The email is not valid.
}
如果您使用的是 maven,那么您可以使用 this dependency、
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.4.0</version>
<type>jar</type>
</dependency>
检查下面的代码,我相信它满足您的电子邮件验证。
Apache 通用语言 maven dependency.
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
Java 电子邮件 验证实用程序代码。
public class EmailValidationUtility {
private static final String[] SPECIAL_CHARACTERS_FOR_USERNAME = new String[] {
"..", "__", ",", "/", "<", ">", "?", ";", ":", "\"", "\"",
"{", "}", "[", "]", "|", "\", "!", "@", "#", "$", "%", "^",
"&", "*", "(", ")", "+", "=", "~", "`" };
private static final char[] SPECIAL_CHARACTERS_WITH_NUMBERS = new char[] {
'.', ',', '/', '<', '>', '?', ';', ':', '\'', '\"', '{',
'}', '[', ']', '|', '\', '!', '@', '#', '$', '%', '^', '&',
'*', '(', ')', '-', '_', '+', '=', '~', '`', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '0' };
/**
* Method to validate the input email is valid or not.
*
* @param email the email
* @return true, if is email valid
*/
public static boolean isEmailValid(String email) {
String[] emailChunks = StringUtils
.splitByWholeSeparatorPreserveAllTokens(email,
"@");
if (emailChunks.length != 2 || isEmailUserNameInvalid(emailChunks[0])
|| StringUtils.isBlank(emailChunks[1])) {
return false;
}
String[] domainNames = StringUtils
.splitByWholeSeparatorPreserveAllTokens(emailChunks[1],
".");
if (domainNames.length < 2) {
return false;
}
int topLevelDomainNameIndex = domainNames.length - 1;
if (isTopLevelDomainNameInvalid(domainNames[topLevelDomainNameIndex])) {
return false;
}
domainNames = ArrayUtils.remove(domainNames, topLevelDomainNameIndex);
return (isDomainNameValid(domainNames));
}
private static boolean isEmailUserNameInvalid(String emailUserName) {
return (StringUtils.isBlank(emailUserName) || StringUtils.containsAny(
emailUserName, SPECIAL_CHARACTERS_FOR_USERNAME));
}
private static boolean isTopLevelDomainNameInvalid(String topLevelDomain) {
return (StringUtils.isBlank(topLevelDomain) || StringUtils.containsAny(
topLevelDomain, SPECIAL_CHARACTERS_WITH_NUMBERS));
}
private static boolean isDomainNameValid(String[] domainNames) {
for (String domainName : domainNames) {
if ((StringUtils.isBlank(domainName) || StringUtils.containsAny(
domainName, SPECIAL_CHARACTERS_WITH_NUMBERS))) {
return false;
}
}
return true;
}
}
我知道使用 Regex 验证电子邮件只需要 3-4 行代码。但是,我正在寻找验证电子邮件 without using
Regex.
在某种程度上,代码成功地通过了几乎所有然而,验证仍然无法弄清楚 - 如何避免特殊字符成为电子邮件地址的第一个和最后一个字符。
特殊字符列表= {'!', '#', '$', '%', '^', '&', '*', '(', ')', '-', '/', '~', '[', ']'} ;
我正在看的是:
If the username section (
abc.xyz
@gmail.com) starts or ends with any of the special characters, it should trigger an "Invalid email address" error. The same goes with domain section as well.
例如... 下面的 email-IDs 列表应该打印一个 "Invalid email ID" error message
#abc.xyz@gmail.com
abc.xyz&@gmail.com
abc.xyz&@!gmail.com
abc.xyz&@gmail.com!
import java.util.Scanner;
public class Email_Validation {
public static void main(String[] args) {
// User-input code
Scanner scan = new Scanner(System.in);
System.out.println("Enter your email address");
String email = scan.next();
// Code to check if email ends with '.' (period sign)
boolean checkEndDot = false;
checkEndDot = email.endsWith(".");
// Code to find out last index of '@' sign
int indexOfAt = email.indexOf('@');
int lastIndexOfAt = email.lastIndexOf('.');
//Code to check occurence of @ in the email address
int countOfAt = 0;
for (int i = 0; i < email.length(); i++) {
if(email.charAt(i)=='@')
countOfAt++; }
// Code to check occurence of [period sign i..e, "."] after @
String buffering = email.substring(email.indexOf('@')+1, email.length());
int len = buffering.length();
int countOfDotAfterAt = 0;
for (int i=0; i < len; i++) {
if(buffering.charAt(i)=='.')
countOfDotAfterAt++; }
// Code to print userName & domainName
String userName = email.substring(0, email.indexOf('@'));
String domainName = email.substring(email.indexOf('@')+1, email.length());
System.out.println("\n");
if ((countOfAt==1) && (userName.endsWith(".")==false) && (countOfDotAfterAt ==1) &&
((indexOfAt+3) <= (lastIndexOfAt) && !checkEndDot)) {
System.out.println("\"Valid email address\"");}
else {
System.out.println("\n\"Invalid email address\""); }
System.out.println("\n");
System.out.println("User name: " +userName+ "\n" + "Domain name: " +domainName);
}
}
如何解决这个问题?
所以,看一下字符串 API。 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
具体来说,您有 String.length() 和 String.charAt()。因此,您可以非常非常轻松地从 String 中获取第一个和最后一个字符。您已经在您的代码中完成了这一点;假设你已经得到它。
您可以 运行 通过此处的长 if 语句;
char first = email.charAt(0);
if (first == '!' || first == '#' || <more here>) {
return false;
}
但这可能会让人头疼。另一种方法是使用 Set,如果您需要多次检查,这种方法效率更高。 (查找 HashSet 通常非常快。)您只需创建一次集合,然后就可以多次使用它,例如 Set.contains(first)。
这个怎么样:
public class EmailMe {
private static Set<Character> bad = new HashSet<>();
public static void main(String[] args) {
char[] specialChars = new char[] {'!', '#', '$', '%', '^', '&', '*', '(', ')', '-', '/', '~', '[', ']'} ;
for (char c : specialChars) {
bad.add(c);
}
check("#abc.xyz@gmail.com");
check("abc.xyz&@gmail.com");
check("abc.xyz&@!gmail.com");
check("abc.xyz&@gmail.com!");
}
public static void check(String email) {
String name = email.substring(0, email.indexOf('@'));
String domain = email.substring(email.indexOf('@')+1, email.length());
// String[] split = email.split("@");
checkAgain(name);
checkAgain(domain);
}
public static void checkAgain(String part) {
if (bad.contains(part.charAt(0))) System.out.println("bad start:"+part);
if (bad.contains(part.charAt(part.length()-1))) System.out.println("bad end:"+part);
}
}
我使用 Apache Commons 库中的 EmailValidator。
上面的例子,
String email = "anEmailAddress@domain.com";
EmailValidator validator = EmailValidator.getInstance();
if (!validator.isValid(email)) {
// The email is not valid.
}
或
if (!EmailValidator.getInstance().isValid("anEmailAddress@domain.com")) {
// The email is not valid.
}
如果您使用的是 maven,那么您可以使用 this dependency、
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.4.0</version>
<type>jar</type>
</dependency>
检查下面的代码,我相信它满足您的电子邮件验证。
Apache 通用语言 maven dependency.
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
Java 电子邮件 验证实用程序代码。
public class EmailValidationUtility {
private static final String[] SPECIAL_CHARACTERS_FOR_USERNAME = new String[] {
"..", "__", ",", "/", "<", ">", "?", ";", ":", "\"", "\"",
"{", "}", "[", "]", "|", "\", "!", "@", "#", "$", "%", "^",
"&", "*", "(", ")", "+", "=", "~", "`" };
private static final char[] SPECIAL_CHARACTERS_WITH_NUMBERS = new char[] {
'.', ',', '/', '<', '>', '?', ';', ':', '\'', '\"', '{',
'}', '[', ']', '|', '\', '!', '@', '#', '$', '%', '^', '&',
'*', '(', ')', '-', '_', '+', '=', '~', '`', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '0' };
/**
* Method to validate the input email is valid or not.
*
* @param email the email
* @return true, if is email valid
*/
public static boolean isEmailValid(String email) {
String[] emailChunks = StringUtils
.splitByWholeSeparatorPreserveAllTokens(email,
"@");
if (emailChunks.length != 2 || isEmailUserNameInvalid(emailChunks[0])
|| StringUtils.isBlank(emailChunks[1])) {
return false;
}
String[] domainNames = StringUtils
.splitByWholeSeparatorPreserveAllTokens(emailChunks[1],
".");
if (domainNames.length < 2) {
return false;
}
int topLevelDomainNameIndex = domainNames.length - 1;
if (isTopLevelDomainNameInvalid(domainNames[topLevelDomainNameIndex])) {
return false;
}
domainNames = ArrayUtils.remove(domainNames, topLevelDomainNameIndex);
return (isDomainNameValid(domainNames));
}
private static boolean isEmailUserNameInvalid(String emailUserName) {
return (StringUtils.isBlank(emailUserName) || StringUtils.containsAny(
emailUserName, SPECIAL_CHARACTERS_FOR_USERNAME));
}
private static boolean isTopLevelDomainNameInvalid(String topLevelDomain) {
return (StringUtils.isBlank(topLevelDomain) || StringUtils.containsAny(
topLevelDomain, SPECIAL_CHARACTERS_WITH_NUMBERS));
}
private static boolean isDomainNameValid(String[] domainNames) {
for (String domainName : domainNames) {
if ((StringUtils.isBlank(domainName) || StringUtils.containsAny(
domainName, SPECIAL_CHARACTERS_WITH_NUMBERS))) {
return false;
}
}
return true;
}
}