闰年检测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正则表达式)