常用正则表达式

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. 验证邮箱

邮箱用户名满足以下条件:

  1. 可以为纯数字(但不可以以0开头);
  2. 可以为数字,下滑点,点和字母表示;
  3. 不可以以下划线开头;
  4. 用户名长度在6-28个字符之间;

邮箱名称可以为纯数字(0除外),即开头1-9之间的数字可以出现,也可以不出现,另外中间主体部分可以为英文字符、下划线、点和数字,所以,用户名判断方面面的正则可以写为:

([1-9]?[0-9a-zA-Z_\\.])

服务器的供应商(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. 年份:方面虽然存在平年和闰年,但是可以用通用的表示方法来表示平年,再与闰年的年份进行 "|" 即可;
  2. 月份:
    • 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天,其他与平年一样,所以,闰年可以表示为:

  1. 年份可以用一下三种方式表示:
    • [0-9]{2}[2468][048]
    • [0-9]{2}0[48]
    • [0-9]{2}[13579][26]
  2. 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
	}
	
}
posted @ 2018-06-05 15:23  Java路上小菜鸟  阅读(242)  评论(0)    收藏  举报