如果大家对正则没有一点基础,可以查看这几篇文章:
Java中正则表达式的基本使用
正则表达式中的基本正则规则详解01
正则表达式中的基本正则规则详解02
进入正题:
邮箱验证
- 电子邮箱由: “用户名@主机域名”组成。
- 用户名的开头不能由点号组成,不是第一位的位置就可以添加点号,但是点号不能够串联>=两个。
- 用户名的合法用户名由大小写英文字母(不区分大小写)、数字、下划线(可以串联任意个,也可以写在用户名开头)、横线(“-“,”-“可以串联任意个,但是不能够写在用户名开头)、点号(不能串联超过>=2个,不能写在用户名开头)组成。
- 主机域名由大小写英文字母、数字、横线(“-“,不可以串联>=2个,不能写在域名开头和结尾)、点号组成。域名不能有下划线,大家可以去注册域名看看,域名是不能有下划线的哦。
- 并且用户名和主机域名是不区分大小写的。在处理发送的时候都是会用小写。
- 大家如果不相信可以到mail.qq.com试试,到写信界面的收信人的输入框上面试试。
- 读者大可放心的发送信件,只是腾讯服务器会给你回信说,发不出去。并且会返回给你,收信人的小写地址。
这是腾讯QQ邮箱的正则表达验证(从js中提取的):^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$
个人感觉QQ邮箱的验证有些地方有点影响效率。
这样写应该好一点:^(?:\w+)(?:\.\w+)*@(?:\w+)(?:(?:\.\w+)+)$ 就是让QQ邮箱原本的匹配不会保存已经匹配成功的字符串。
但是,貌似这条js只是客户端的js,不是服务端的。所以客户端的匹配不严谨。而且,当主机域名的开始位置有横线时,腾讯那边也能够匹配成功!所以腾讯那边还是匹配得有错的。但是邮箱的要求还是按照上面的几条规则组成,读者可以根据腾讯qq给出的邮箱正则修改。
下面给出我自己写的邮箱正则规则:(大家看到正则很长不必害怕,其实仔细一看还是能够懂得。要结合上面邮箱的组成规则一起看。想当初作者我也是看到一条正则邮箱验证看不懂才去学习正则的。本篇开始也给出了学习正则的相关博客,从0到能够看懂下面的正则表达式)
^(?:\\w+)[(?:\\.[-\\w]+)(?:[-\\w]+)]*@(?:[a-zA-Z0-9]+)(?:-[a-zA-Z0-9]+)*(?:\\.[a-zA-Z0-9]+)+$
//也可以进行适当的简化,下面是简化后
^(?i)(?:\\w+)[(?:\\.[-\\w]+)(?:[-\\w]+)]*@(?:[a-z0-9]+)(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+)+$
下面给出邮箱测试程序:
import java.util.Scanner;
public class pa36{
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
//^(?:\\w+)(?:\\.\\w+)*@(?:\\w+)(?:(?:\\.\\w+)+)$//腾讯加强后的简化正则
//^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$//腾讯QQ邮箱验证正则(我从js源码中提取的)
//自己写的正则:^(?:\\w+)[(?:\\.[-\\w]+)(?:[-\\w]+)]*@(?:[a-zA-Z0-9]+)(?:-[a-zA-Z0-9]+)*(?:\\.[a-zA-Z0-9]+)+$
String regex="^(?i)(?:\\w+)[(?:\\.[-\\w]+)(?:[-\\w]+)]*@(?:[a-z0-9]+)(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+)+$";
System.out.println("请输入邮箱地址...");
boolean flag=false;
while(scanner.hasNext()){
if(flag)
System.out.println("请输入邮箱地址...");
flag=true;
String sta=scanner.next();
if(sta.matches(regex)){
System.out.println(sta+" 是一个合法邮箱!!");
}else{
System.out.println(sta+" 不是一个合法邮箱!!");
}
}
}
}