如何判断随机字符串是电子邮件地址还是其他内容

时间:2013-08-27 11:14:30

标签: java email

我认为之前没有问过这个问题......我当然找不到符合此要求的内容。

背景

有一个返回ID的人的API。一般来说,ID应被视为区分大小写...但如果ID实际上是他们的电子邮件地址......并且您正在谈论此API的一个不那么出色的实现,它返回其电子邮件地址的大小写混合版本,有很多乐趣......

所以你正在谈论一个实现......它会给你提供像ID一样的URL,例如

  • http://foo.bar.com/blahblahblah

接下来你可以和另一个实现进行交流......这会给你一些非显而易见的ID,例如

  • as€jlhdésdj678hjghas7t7qhjdhg£

你可能正在谈论一个很好的实现,它会给你一个漂亮的小写电子邮件地址:

  • bob.mcspam@acme.org

或者你可能正在谈论不那么出色的实现,它返回完全等效的ID

  • bob.mcspam@ACME.org
RFC 2821规定只有邮箱区分大小写,但利用区分大小写的情况会导致大量的操作间问题......

我想要做的是识别电子邮件的字符串并强制域小写。由于方案是httphttps,因此识别像字符串这样的URI更容易,我只需要小写一个更易于解析的域名。

问题

如果给出外部服务提供的字符串,是否有我可以使用的测试将确定该字符串是否是电子邮件地址,以便我可以强制域名小写?

可以忽略少量电子邮件地址,并且不会使域名小写。 (允许假阴性)

如果字符串的一部分不是电子邮件地址的域部分,则强制将字符串的一部分强制为小写是不可接受的。 (不允许误报)

更新

请注意,此问题与thisthis略有不同,因为在您已经知道字符串应该是电子邮件地址的那两个问题的上下文中

在这个问题的上下文中,我们不知道字符串是电子邮件地址还是别的......这使得这个问题不同

5 个答案:

答案 0 :(得分:8)

- 请尝试以下代码,这可能会对您有所帮助。

public class EmailCheck {

    public static void main(String[] args){


        String email = "vivek.mitra@gmail.com";
        Pattern pattern = Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}");
        Matcher mat = pattern.matcher(email);

        if(mat.matches()){

            System.out.println("Valid email address");
        }else{

            System.out.println("Not a valid email address");
        }
    }

}

- 另请查看此网站,该网站使用regular expression显示另一个更深入的验证。 Deeper validation using regular expression

答案 1 :(得分:6)

您可以使用以下方法验证电子邮件;

String email ="nbjvkj@kn.com"
Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
Matcher m = p.matcher(email);
boolean matchFound = m.matches();
if (matchFound) {
    //your work here
}

答案 2 :(得分:2)

感谢@Dukeling

private static toLowerCaseIfEmail(String string) {
    try {
        new InternetAddress(string, true);
    } catch (AddressException e) {
        return string;
    }
    if (string.trim().endsWith("]")) {
        return string;
    }
    int lastAt = string.lastIndexOf('@');
    if (lastAt == -1) {
        return string;
    }
    return string.substring(0,lastAt)+string.substring(lastAt).toLowerCase();
}

,据我所知,做必要的事情。

更新

由于前一个忽略了(comment)语法之后@语法的可能性......让我们面对它,如果我们看到它们应该快速拯救并返回未经修改的字符串

private static toLowerCaseIfEmail(String string) {
    try {
        new InternetAddress(string, true);
    } catch (AddressException e) {
        return string;
    }
    int lastAt = string.lastIndexOf('@');
    if (lastAt == -1 
        || string.lastIndexOf(']') > lastAt
        || string.lastIndexOf(')' > lastAt) {
        return string;
    }
    return string.substring(0,lastAt)+string.substring(lastAt).toLowerCase();
}

答案 3 :(得分:0)

        Pattern pattern = Pattern.compile("^[A-Za-z0-9._]{1,16}+@{1}+[a-z]{1,7}\\.[a-z]{1,3}$");
        Matcher mail = pattern.matcher(your_mail);

        if (mail.find()) {
            System.out.println("True");
        } else {
            System.out.println("False");
        }

答案 4 :(得分:0)

我的建议是使用:

org.apache.commons.validator.routines.EmailValidator.isValid(value::String)

https://commons.apache.org/proper/commons-validator/apidocs/org/apache/commons/validator/routines/EmailValidator.html