`

闰年检测Java正则表达式

阅读更多
/**
 * 
 */
package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;



/**
 * @author 江进武
 * 2012-12-5
 */

public class Runnian {

	public static void main(String[] args){
		for (int i=1 ;i<9999;i++){
			if((i%4== 0 && i%100!=0) ||( i%100==0 && i%400==0)){
	 	      System.out.print(i+"\t");

	       //	 4	8	12	16	20	24	28	32	36	40	44	48	52	56	60	64	68	72	76	80	84	88	92	96	104	108	112	116	120	124	128	132	136	140	144	148	152	156	160	164	...	
         944	948	952	956	960	964	968	972	976	980	984	988	992	996
			//1004	1008	1012	1016	1020	1024	1028	1032	1036	1040	1044	1048	1052	1056	1060	1064	1068	1072	1076	1080	1084	1088	1092	1096	1104	1108	....
         9976	9980	9984	9988	9992	9996							}
			
		}
		
//思路 按照年份位数用四个表达式组合,世纪年单算

//一位:[48]

//两位:"[13579]6[2468]0[2468]4[2468]8[13579]2"
//突然发现2位的闰年份加上00就是4位的世纪年闰年,只要两位闰  
 //年不重复不遗漏,4位的世纪年闰年就不会重复也不会遗漏
//简化可得"(([13579][26])|([2468][048]))(00)?"

	
		//三位:  104 124 144 164 184 204 204 224  
		//108  128 148 
		//112 132 152
		//116 136 156 176 196 216
		// 120 140 160 180 220  240 	
	//由上分析可得 "[1-9][02468]4" "[1-9][02468]8" [1-9][13579]2 [1-9][13579]6   [1-9][2468]0 ==》 ([1-9][02468][48])|([1-9][13579][26])|([1-9][2468]0)
		
		
		//4位
		
		//[1-9]\\d[02468]4  [1-9]\d[02468]8 [1-9]\d[13579]2 [1-9]\d[13579]6  [1-9]\d[2468]6 ==> ([1-9]\d[02468][48])|([1-9]\d[13579][26]|( [1-9]\d[2468]6))
		

//组合并加上注释
		
		Pattern pattern = Pattern.compile("([48](00)?)|(([13579][26])|([2468][048]))(00)?#两位|([1-9][02468][48])|([1-9][13579][26])|([1-9][2468]0)#三位|([1-9]\\d[02468][48])|([1-9]\\d[2468][0])|([1-9]\\d[13579][26]|)");
//通过java测试发现不正确,有些闰年没有匹配出来,放在正则表达式工具中能够匹配

//去掉注释,并测试是闰年而没有匹配,不是闰年但匹配的。		
 pattern = Pattern.compile("([48](00)?)|(([13579][26])|([2468][048]))(00)?|(([1-9][02468][48])|([1-9][13579][26])|([1-9][2468]0))||([1-9]\\d[02468][48])|([1-9]\\d[2468][0])|([1-9]\\d[13579][26])");
		 
		 System.out.println("");
		System.out.println("test");
		for (int i=1 ;i<10000;i++){
			Matcher m =	pattern.matcher(i+"");
			if((i%4== 0 && i%100!=0) ||( i%100==0 && i%400==0)){
				if(!m.matches()){
					System.out.println(i);
				}
			}
			else{
				if(m.matches()){
					System.out.println(i);
				}
			}
			
		}
		
	} 
//test 后面没有值,说明正确     

//表达式有点长看看能不能简化?仔细一看,原来3位年份和4位年份的表达式只相差了一个\\d  所以继续简化为:
		pattern = Pattern.compile("" +
				"([48](00)?)" +
				"|(([13579][26])|([2468][048]))(00)?" +
				"|([1-9]\\d?[02468][48])|([1-9]\\d?[2468][0])|([1-9]\\d?[13579][26])");       
}
分享到:
评论

相关推荐

    java代码验证日期格式正则表达式(包含闰年验证)带注释

    /** * @param 日期验证,验证的格式有: * "yyyyMM","yyyyMMdd","yyyyMMdd HH:mm:ss", * "yyyy-MM","yyyy-MM-dd","yyyy-MM-dd HH:mm:ss" * "yyyy.MM","yyyy.MM.dd","yyyy.MM.dd HH:mm:ss" * "yyyy/MM","yyyy/MM...

    经典的判断日期类型的正则表达式

    经典的判断日期类型的正则表达式,并且带闰年闰月的正则表达式

    C# 正则应用之——最全的日期正则表达式 没有之一

    由于闰年的存在,使得日期的校验正则变得比较复杂。 先来考察一下日期的有效范围以及什么是闰年。 2 日期的规则 2.1 日期的有效范围 对于日期的有效范围,不同的应用场景会有所不同。 MSDN中定义的DateTime对象的...

    C# 最全的日期正则表达式,没有之一

    考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。 ^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2...

    JAVA正则表达式入门

    众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时 又比较复杂,如果用纯编码方式解决,往往会浪费...因此,学习及使用正则表达式, 便成了解决这一矛盾的主要手段

    验证日期正则表达式推导方法

    验证日期的正则表达式加入闰年的判断以及思路分析。什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释。

    日期正则表达式

    日期正则表达式,验证日期的格式,及是否为闰年。

    15/18位身份证号码验证的正则表达式总结(详细版)

    开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单、效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧。 介绍 xxxxxx yyyy MM dd 375 0 十八位 xxxxxx yy MM...

    日常应用的正则表达式

    正则表达式日常应用,包括日期类型,闰年的判断

    常用的C#正则表达式

    常用的C#正则表达式 邮箱 域名的 闰年和2月 限制只能输入中文

    验证日期的正则表达式及其注释(包含闰年验证)

    验证日期的正则表达式及其注释(包含闰年验证) yyyy-mm-dd 常用日期格式

    匹配yyyy-mm-dd日期格式的的正则表达式

    其实我也很头疼正则表达式,百度了一些资料,总结一下,这里留个备份吧。 要考虑的问题:合法的日期是多少;每个月的天数不一样;闰年的问题。。。。 1、合法的日期:MSDN上规定–在公元(基督纪元)0001 年 1 月 1 ...

    正则表达式验证日期格式

    经典!! 正则验证日期格式,支持验证月份和日期(2月也支持),支持闰年和平年验证,绝对经典!!

    Android常用字符串匹配正则

    isDate : 验证yyyy-MM-dd格式的日期校验,已考虑平闰年 isIP : 验证IP地址 isMatch : 判断是否匹配正则 getMatches : 获取正则匹配的部分 getSplits : 获取正则匹配分组 getReplaceFirst: 替换正则匹配的第一部分 ...

    一个特牛的日期时间判断正则表达式

    这里是判断YYYY-MM-DD这种格式的,基本上把闰年和2月等的情况都考虑进去了,不过我已经忘了在哪里找到的。 ^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?...

    java代码-使用java解决计算闰年的判断的问题的源代码

    java代码-使用java解决计算闰年的判断的问题的源代码 ——学习参考资料:仅用于个人学习使用!

    史上最详细的js日期正则表达式分享

    最简单的正则 如 : /d{4}-/d{2}-/d{2}但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题….. 对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到...

    java闰年程序

    java 闰年 程序 学习java必须要学习的经典案例,加油学习把

    java使用maven求闰年

    编写一个DateUtil的类,里面有一个isLeapYear(int year) 的方法,判断输入年份是否是闰年。如果是闰年,返回true,其他返回false。闰年需要满足以下3个条件: 年份必须大于0,且小于等于10000。 年份不能整除100,...

    使用Java编写的闰年计算

    用java计算闰年,经典案例,常用于各种程序语言的教学等等呢个

Global site tag (gtag.js) - Google Analytics