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

Java 如何判断随机字符串是电子邮件地址还是其他内容,java,email,Java,Email,我不认为以前有人问过这个问题。。。我当然找不到有这个要求的东西 背景 有一个API可以返回人的ID。一般来说,ID应视为区分大小写。。。但是如果ID实际上是他们的电子邮件地址。。。你正在谈论这个API的一个不太出色的实现,它返回他们电子邮件地址的一个混合版本,有很多乐趣可以享受 因此,您正在讨论一个实现。。。它会返回URL,比如ID http://foo.bar.com/blahblahblah 下一步您可能要讨论另一个实现。。。这会返回一些不明显的ID,例如 作为欧元jlhdésdj67

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

背景 有一个API可以返回人的ID。一般来说,ID应视为区分大小写。。。但是如果ID实际上是他们的电子邮件地址。。。你正在谈论这个API的一个不太出色的实现,它返回他们电子邮件地址的一个混合版本,有很多乐趣可以享受

因此,您正在讨论一个实现。。。它会返回URL,比如ID

  • http://foo.bar.com/blahblahblah
下一步您可能要讨论另一个实现。。。这会返回一些不明显的ID,例如

  • 作为欧元jlhdésdj678hjghas7t7qhjdhg
您可能正在与一个很好的实现对话,该实现为您提供了一个很好的小写电子邮件地址:

  • bob。mcspam@acme.org
或者,您可以与返回完全相同ID的不太出色的实现进行对话

  • bob。mcspam@ACME.org
RFC 2821声明只有邮箱区分大小写,但利用大小写区分会导致大量的互操作问题

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

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

一小部分电子邮件地址丢失并且域名没有小写是可以接受的。(容许假阴性)

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

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

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

多亏了@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();
}
据我所知,我们应该做必要的事情

更新 因为上一个忽略了在最后一个
@
之后出现
(注释)
语法的可能性。。。让我们面对现实吧,如果我们看到他们应该快速跳出并返回未修改的字符串

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

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

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
}

-尝试下面的代码,这可能会对您有所帮助

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

}

-还可以看看这个网站,它展示了另一个使用
正则表达式的更深层次的验证

我的建议是使用:

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

除了检查域是否存在以及DNS条目中是否有电子邮件服务器外,为什么不能使用regexp检查语法合法的电子邮件地址?很多人四处飞来飞去。可能是重复的,还有@radai。我不想在代码路径上调用DNS查询,在那里对代码进行评估,因为这会带来问题。。。具体来说,运行此代码的服务器可能无法验证返回ID中的域名。因此检查DNS条目是多余的。DNS验证是额外的一步,但除了regexp之外,我真的看不到任何其他解决方法这真的是答案吗?是的,因为RFC 2821中的电子邮件规范比您想象的要陌生得多,使用标准Java API的最佳方法是让符合规范的解析器解析请求并保留路由路径地址(因此,
endsWith(“])
)我打赌@stephennolly已经发了很多电子邮件。他知道痛苦。当然,我的尝试不会处理电子邮件地址中的评论<代码>约翰。“M@c““Smith!”(coolguy)@(thefantastic)[1.2.3.4](仅限Best)
也是一个有效的电子邮件地址。。。但是,如果不使用
endsWith(“[”
),而是检查
indexOf(']')
),它可能会被安全地忽略,因为这将指示一个不需要小写为
[]的电子邮件地址
仅适用于regex在
@
符号后匹配过多的IP地址,因为它应该只匹配有效构造的域名。请注意,
“ping@pong!”@[1.2.3.4]
是一个有效的电子邮件地址,您的代码将无法正确识别该地址。。。现在,它也是一个有效的电子邮件地址,不需要在
@
之后将位小写,但这是另一个问题。使用正则表达式识别电子邮件地址是一种反模式。您能否提供一个解释来说明您的答案?对于像
myname这样的电子邮件地址,TAF失败+classifier@gmail.com
或任何奇特的邮箱标识符,例如
“name with spaces”@example.com
是一个有效的电子邮件地址(即使是一个愚蠢的地址),并且不会通过您的regexOh,对于我的实际gmail电子邮件地址也会失败,因为我的邮箱标识符是21个字符,但文档给出了以下免责声明:
“此实现不保证捕获电子邮件地址中所有可能的错误。”
org.apache.commons.validator.routines.EmailValidator.isValid(value::String)