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