对于email地址的定义,可以参考RFC822,里面有详细的说明。
1、采用正则表达式的方式来验证email地址:
JS处理方式(来自javascript.internet.com的Sandeep V. Tamhankar):
function checkEmail(emailStr) {
if (emailStr.length == 0) {
return true;
}
var emailPat=/^(.+)@(.+)$/;
// \(\)<>@,;:\\\"\.\[\]
var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
// [^\s\(\)<>@,;:\\\"\.\[\]]
var validChars="\[^\\s" + specialChars + "\]";
//("[^"]*")
var quotedUser="(\"[^\"]*\")";
var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
// [^\s\(\)<>@,;:\\\"\.\[\]]+
var atom=validChars + '+';
// ([^\s\(\)<>@,;:\\\"\.\[\]]+|("[^"]*"))
var word="(" + atom + "|" + quotedUser + ")";
//^([^\s\(\)<>@,;:\\\"\.\[\]]+|("[^"]*"))(\.([^\s\(\)<>@,;:\\\"\.\[\]]+|("[^"]*")))*$
var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
// ^([^\s\(\)<>@,;:\\\"\.\[\]]+|("[^"]*"))(\.([^\s\(\)<>@,;:\\\"\.\[\]]+|("[^"]*")))*$
var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
var matchArray=emailStr.match(emailPat);
if (matchArray == null) {
return false;
}
var user=matchArray[1];
var domain=matchArray[2];
if (user.match(userPat) == null) {
return false;
}
var IPArray = domain.match(ipDomainPat);
if (IPArray != null) {
for (var i = 1; i <= 4; i++) {
if (IPArray[i] > 255) {
return false;
}
}
return true;
}
var domainArray=domain.match(domainPat);
if (domainArray == null) {
return false;
}
var atomPat=new RegExp(atom,"g");
var domArr=domain.match(atomPat);
var len=domArr.length;
if ((domArr[domArr.length-1].length < 2) ||
(domArr[domArr.length-1].length > 3)) {
return false;
}
if (len < 2) {
return false;
}
return true;
}
下面是我的java实现:
public static String SPECIAL_CHARS = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
public static String VALID_CHARS = "[^\\s" + SPECIAL_CHARS + "]";
public static String QUOTED_USER = "(\"[^\"]*\")";
public static String ATOM = VALID_CHARS + "+";
public static String WORD = "(" + ATOM + "|" + QUOTED_USER + ")";
public static String EMAIL_PATTERN = "^(.+)@(.+)$";
public static String IP_DOMAIN_PATTERN = "^(\\d{1,3}).(\\d{1,3}).(\\d{1,3}).(\\d{1,3})$";
public static String USER_PATTERN = "^" + WORD + "(\\." + WORD + ")*$";
public static String DOMAIN_PATTERN = "^" + ATOM + "(\\." + ATOM + ")*$";
public static String LEGAL_ASCII_PATTERN = "^[\\0000-\\0177]+$";
public static String SINGLE_EMAIL_PATTERN = "(" + ATOM + "(\\." + ATOM + ")*@" + ATOM
+ "(\\." + ATOM + ")*)";
public static boolean isValid(String input) {
if (input == null) {
return false;
}
if (!Pattern.matches(LEGAL_ASCII_PATTERN, input)) {
return false;
}
Matcher email = Pattern.compile(EMAIL_PATTERN).matcher(input);
if (!email.matches()) {
return false;
}
if (!Pattern.matches(USER_PATTERN, email.group(1))) {
return false;
}
String domain = email.group(2);
Matcher ips = Pattern.compile(IP_DOMAIN_PATTERN).matcher(domain);
if (ips.matches()) {
for (int i = 1; i <= 4; i++) {
if (Integer.parseInt(ips.group(i)) > 255) {
return false;
}
}
return true;
}
if (!Pattern.matches(DOMAIN_PATTERN, domain)) {
return false;
}
return true;
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("test@test.com");
list.add("te%$#st@test.com");
list.add("test@127.0.0.1");
list.add("test@127.258.0.1");
list.add("te我的家@test.com test2@test.com");
list.add("Alfred.Neuman@BBN-TENEXA");
list.add("\"George,Ted\"@Group.Arpanet");
list.add("Wilt(the Stilt)Chamberlain@NBA.US goodjob@test.com");
for (String str : list) {
System.out.println(isValid(str));
}
System.out.println();
// 从输入字符串中提取电子邮件地址
Pattern ascill = Pattern.compile(LEGAL_ASCII_PATTERN);
Pattern p = Pattern.compile(SINGLE_EMAIL_PATTERN);
Matcher m = p.matcher("");
String temp = null;
for (String str : list) {
m.reset(str);
while (m.find()) {
temp = m.group();
if (ascill.matcher(temp).matches()) {
System.out.println(temp);
}
}
}
}
运行结果:
true
true
true
false
false
true
true
false
test@test.com
te%$#st@test.com
test@127.0.0.1
test@127.258.0.1
test2@test.com
Alfred.Neuman@BBN-TENEXA
Chamberlain@NBA.US
goodjob@test.com