8

我认为以前没有问过这个问题......我当然找不到有这个要求的东西。

背景

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

所以你正在谈论一种实现......它会给你返回URL之类的东西作为ID,例如

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

您接下来可能会与另一个实现交谈......这会给您一些不明显的 ID,例如

  • as€jlhdésdj678hjghas7t7qhjdhg£

您可能正在与一个不错的实现交谈,它会为您返回一个不错的小写电子邮件地址:

  • bob.mcspam@acme.org

或者您可能正在与返回完全相同 ID 的不太出色的实现交谈

  • bob.mcspam@ACME.org

RFC 2821 声明只有邮箱区分大小写,但利用区分大小写会导致大量互操作问题......

我想要做的是识别作为电子邮件的字符串并强制域为小写。识别类似字符串的 URI 更容易,因为方案是httpor https,我只需要将域名小写,这样更容易解析。

问题

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

遗漏一小部分电子邮件地址并且不将域名小写是可以接受的。(允许假阴性)

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

 更新

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

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

4

5 回答 5

12

-试试下面的代码,这可能对你有帮助。

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. 使用正则表达式进行更深入的验证

于 2013-08-27T11:59:48.270 回答
7

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

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
}
于 2013-08-27T11:40:05.537 回答
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();
}
于 2013-08-27T11:30:06.323 回答
2

我的建议是使用:

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

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

于 2019-01-10T05:49:53.750 回答
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");
        }
于 2016-07-20T12:13:36.490 回答