我正在研究检查String
是否为有效电子邮件地址的最佳方法。我现在关注两个选项,即使用javax.mail.internet.InternetAddress
;或者使用Apache Commons EmailValidator
,它在内部使用复杂的正则表达式解析器。
我想知道在正确性方面挑选一个是否有任何优势,或者两者都很好?我知道InternetAddress
在某些情况下不能有效处理非ascii字符的事实。
答案 0 :(得分:16)
您可以使用Apache Commons Validator库中的EmailValidator:
import org.apache.commons.validator.EmailValidator;
...
EmailValidator validator = EmailValidator.getInstance();
if (validator.isValid(email)) {
// is valid, do something
} else {
// is invalid, do something
}
isValid 方法检查某个字段是否包含有效的电子邮件地址。
根据这个问题,这是最好的Java电子邮件地址验证方法 What is the best Java email address validation method?
答案 1 :(得分:1)
对于像电子邮件地址格式那样完善的东西,两种方法之间的差异是微不足道的。再说,五十年前,人们从未看到过需要使用4位数进行编码,所以......
使用来自Apache Commons的正则表达式的唯一“缺陷”是,它验证电子邮件地址的功能不是“Java标准”。影响您作为开发人员的程度如何?取决于你是多么偏执。
另一方面,标准Java实现可能效率较低。您必须构造InternetAddress
并验证它。看看JavaMail的源代码,我可以看到:
/**
* Check that the address is a valid "mailbox" per RFC822.
* (We also allow simple names.)
*
* XXX - much more to check
* XXX - doesn't handle domain-literals properly (but no one uses them)
*/
(XXX
似乎是某种音符,或“待办事项”
答案 2 :(得分:0)
我刚测试过,显然InternetAddress的性能基本比使用EmailValidator更好
package com.avaya.oss.server.errors;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import org.apache.commons.validator.EmailValidator;
public class TestValidationTypes {
static String email = "test@testy.com";
static int maxItr = 10000;
public static void main(String[] args) throws AddressException {
long start = System.currentTimeMillis();
for (int i = 0; i < maxItr; i++) {
EmailValidator.getInstance().isValid(email);
}
System.out.println("EmailValidator duration: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < maxItr; i++) {
InternetAddress internetAddress = new InternetAddress(email);
internetAddress.validate();
}
System.out.println("InternetAdress duration: " + (System.currentTimeMillis() - start));
}
}
EmailValidator持续时间:1195
网络地址持续时间:67
结果是EmailValidator花了大约20倍的时间: