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

时间:2015-05-23 17:24:13

标签: java email-validation

我知道使用正则表达式验证电子邮件只需要3-4行代码。但是,我希望验证电子邮件 without using Regex. 在某种程度上,代码几乎成功通过了所有验证,但仍然无法弄清楚 - 如何避免特殊字符成为第一个&电子邮件地址的最后一个字符。

specialChars列表= {'!', '#', '$', '%', '^', '&', '*', '(', ')', '-', '/', '~', '[', ']'} ;

我在看的是:

  

如果用户名部分( abc.xyz @ gmail.com)开头或结尾   任何特殊字符,都应触发“无效的电子邮件   地址“错误。同样适用于域名部分。

例如...... 以下电子邮件ID 列表应打印“无效的电子邮件ID” {{1 }}

  

error message

     

#abc.xyz@gmail.com

     

abc.xyz&@gmail.com

     

abc.xyz&@!gmail.com

abc.xyz&@gmail.com!

如何解决此问题?

3 个答案:

答案 0 :(得分:2)

这个怎么样:

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);
  }
}

答案 1 :(得分:1)

所以,看一下String API。 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

具体来说,你有String.length()和String.charAt()。因此,您可以非常轻松地从String中获取第一个和最后一个字符。您已经在代码中执行此操作;假设你已经拥有它。

你可以在这里运行一个长if语句;

mv Dropb-bash: ${prev,,}: bad substitution

但这可能令人头疼。另一种方法是使用Set,如果你需要多次检查,它会更有效。 (查找HashSet通常非常快。)例如,您可以创建一次集合,然后使用Set.contains(第一个)多次使用它。

答案 2 :(得分:0)

检查下面的代码,我相信它可以满足您的电子邮件验证要求。

Apache公共语言专家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;
    }
}