闰年检测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])");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值