1. 验证 IP 地址
IP 地址为 0-255 之间的正整数,首位号段以0开头的IP地址不考虑(IEEE保留的IP地址,不予分配),即可能出现以下三种情况:
情况一:取值在0-9之间(首位号段在1-9之间);
情况二:取值在10-99之间;
情况三:取值在100-255之间;
除了开头段位不可以为0,其他剩下3个部分的段位的取值都是同一范围,因此,正则表达式可以写为:
String regex = null;
regex = "([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5]{2})(\\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5]{2})){3}";
public class TestRegex {
public static void main(String[] args) {
/*
* 情况一:取值在0-9之间(首位号段在1-9之间);[0-9](首位为[1-9])
* 情况二:取值在10-99之间;[1-9][0-9]
* 情况三:取值在100-255之间;1[0-9]{2}|2[0-5]{2}
*
* 除了开头段位不可以为0,其他剩下3个部分的段位的取值都是同一范围,因此,正则表达式可以写为:
*/
String regex = null;
regex = "([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5]{2})(\\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5]{2})){3}";
System.out.println("25.29.15.255".matches(regex));// true
System.out.println("255.255.255.255".matches(regex));// true
System.out.println("0.29.15.255".matches(regex));// false
}
}
2. 验证邮箱
邮箱用户名满足以下条件:
可以为纯数字(但不可以以0开头);
可以为数字,下滑点,点和字母表示;
不可以以下划线开头;
用户名长度在6-28个字符之间;
邮箱名称可以为纯数字(0除外),即开头1-9之间的数字可以出现,也可以不出现,另外中间主体部分可以为英文字符、下划线、点和数字,所以,用户名判断方面面的正则可以写为:
([1-9]?[0-9a-zA-Z_\\.]){6,28}
服务器的供应商(126),这部分可以为数字和英文字符,所以,这部分可以写为:
[0-9a-zA-Z]+
最后是邮箱的结尾部分,目前常用的邮箱结尾有:``com|cn|com.cn|net|gov|org|edt` 等几种常见的结尾,所以,最后部分可以用正则表达式表示为:
com|cn|com.cn|net|gov|org|edt
完整的正则表达式可以写为:
([1-9]?[0-9a-zA-Z_\\.]{6,28})@[0-9a-zA-Z]+\\.(com|cn|com.cn|net|gov|org|edt)
public class TestRegex {
public static void main(String[] args) {
String regex = null;
/*
* 以martin_depp@126.com为例子
*
* 用户名判断 martin_depp:([1-9]?[0-9a-zA-Z_\\.]){6,28}
* @ 和 . 固定方面:@ .
* 服务提供商(126-数字和字母):[0-9a-zA-Z]+
* 后缀名固定方面:com|cn|com.cn|net|gov|org|edt
*/
regex = "([1-9]?[0-9a-zA-Z_\\.]{6,28})@[0-9a-zA-Z]+\\.(com|cn|com.cn|net|gov|org|edt)";
System.out.println("martin_depp@126.com".matches(regex));// true
System.out.println("245749558@126.com".matches(regex));// true
}
}
3. 验证日期
本次以YYYY-MM-DD的格式来验证日期格式是否规范(日和月如果为10以下,可以省略前面的0,年份为0001-9999之间,0不可以省略),因为1-12月不同的月份日期天数存在不同,需要分开计算,另外,闰年作为特殊年份,2月有20天因此也需要分开验证,然后将正则合并。
分析:
年份:方面虽然存在平年和闰年,但是可以用通用的表示方法来表示平年,再与闰年的年份进行 "|" 即可;
月份:
1 月,3 月,5 月,7 月,8 月,10 月,12 月为 31天;
4 月,6 月,9 月,11 月 为 30天;
2月为28或29天;
3.1 验证平年的日期格式:
年份表达为:[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3}
月份表达:
31天:0?[13578]|1[02]-(0?[1-9]|[1-2][0-9]|3[01])
30天:0?[469]|11-(0?[1-9]|[1-2][0-9]|30)
28天:0?2-(0?[1-9]|1[0-9]|2[0-8])
平年完整的正则表达式为:
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})-(((0?[13578]|1[02])-(0?[1-9]|[1-2][0-9]|3[01]))|((0?[469]|11)-(0?[1-9]|[1-2][0-9]|30))|((0?2)-(0?[1-9]|1[0-9]|2[0-8])))
3.2 验证闰年的日期格式:
闰年,即为能整除4,又不能被100整除的年份,此外,与平年唯一不同的就是闰年的2月是29天,其他与平年一样,所以,闰年可以表示为:
年份可以用一下三种方式表示:
[0-9]{2}[2468][048]
[0-9]{2}0[48]
[0-9]{2}[13579][26]
2月表示:0?2-(0?[1-9]|1[0-9]|2[0-9])
完整的闰年正则表达式如下:
([0-9]{2}([2468][048]|0[48]|[13579][26]))-(((0?[13578]|1[02])-(0?[1-9]|[1-2][0-9]|3[01]))|((0?[469]|11)-(0?[1-9]|[1-2][0-9]|30))|((0?2)-(0?[1-9]|1[0-9]|2[0-9])))
完整的日期格式正则验证表达式如下:
public class TestRegex {
public static void main(String[] args) {
String regex = null;
//判断日期注意月和日,排除闰年特殊情况
/*
* 年:0001-9999 :[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3}
* 月:1、3、5、7、8、10、12 :0?[13578]|1[02]
* 4、6、9、11 :0?[469]|11
* 2 :0?2
* 日:大月:0?[1-9]|[1-2][0-9]|3[01]
* :平月:0?[1-9]|[1-2][0-9]|30
* :小月:0?[1-9]|1[0-9]|2[0-8]
*
*/
regex = "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3})-(((0?[13578]|1[02])-(0?[1-9]|[1-2][0-9]|3[01]))|((0?[469]|11)-(0?[1-9]|[1-2][0-9]|30))|((0?2)-(0?[1-9]|1[0-9]|2[0-8])))";
String part01 = regex;
/*
* 闰年情况:
* [0-9]{2}[2468][048]
* [0-9]{2}0[48]
* [0-9]{2}[13579][26]
*/
regex = "([0-9]{2}([2468][048]|0[48]|[13579][26]))-(((0?[13578]|1[02])-(0?[1-9]|[1-2][0-9]|3[01]))|((0?[469]|11)-(0?[1-9]|[1-2][0-9]|30))|((0?2)-(0?[1-9]|1[0-9]|2[0-9])))";
String part02 = regex;
//完整的日期格式校验正则表达式,将两块进行拼接
regex = part01+"|"+part02;
System.out.println("1992-03-28".matches(regex));// true
System.out.println("1992-02-29".matches(regex));// true
System.out.println("1990-02-29".matches(regex));// false
}
}