可能重复:
Verify email in Java
我正在尝试进行非常简单的电子邮件验证。但问题是,当我尝试类似tom@@@@gmail.com
之类的东西时,它会返回true。
以下是代码:
public static boolean validateEmail(String email){
boolean isValidEmail = false;
// Input the string for validation
// String email = "xyz@.com";
// Set the email pattern string
Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
// Match the given string with the pattern
Matcher m = p.matcher(email);
// check whether match is found
boolean matchFound = m.matches();
StringTokenizer st = new StringTokenizer(email, ".");
String lastToken = null;
while (st.hasMoreTokens()) {
lastToken = st.nextToken();
}
if (matchFound && lastToken.length() >= 2
&& email.length() - 1 != lastToken.length()) {
// validate the country code
isValidEmail = true;
}
else isValidEmail = false;
return isValidEmail;
}
请帮忙。提前谢谢。
答案 0 :(得分:6)
.+@.+
会匹配任何内容,包括@
,然后是@
,后跟任何内容,包括@
。请改用[^@]+@[^@]+
。
或停止重新发明轮子,抓住Apache Commons并使用其EmailValidator
。
答案 1 :(得分:5)
您可以使用Javamail API中的类javax.mail.internet.InternetAddress
(有validate
方法)
答案 2 :(得分:2)
这是许多图书馆中解决的问题。不要重新实现自己的。
在regexp中获得100%的正确性要比你想象的要困难得多。
答案 3 :(得分:2)
This site表示以下模式与RFC 5322匹配,涵盖了今天使用的大多数电子邮件地址:
Pattern p = Pattern.compile("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", Pattern.CASE_INSENSITIVE);
我做了一些快速测试。
考虑将编译后的模式存储在常量中以提高性能。
答案 4 :(得分:1)
应为Pattern p = Pattern.compile(".+@{1}+\\.[a-z]+");
<强> BUT:强>
我上面的答案与@larsmans的答案完全相同,因为:
此(评论)me@demo.com 是有效的电子邮件。
您必须阅读RFC:http://tools.ietf.org/html/rfc5322
事实上,使用一个好的库,如apache-commons。