当前位置: 代码迷 >> J2EE >> 求yyyy年mm月dd日的正则表达式解决方法
  详细解决方案

求yyyy年mm月dd日的正则表达式解决方法

热度:76   发布时间:2016-04-17 23:00:36.0
求yyyy年mm月dd日的正则表达式
这是2012-11-12 的匹配正则表达式 
[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))
请教yyyy年mm月dd日的正则表达式该怎么写
------解决思路----------------------
照着这个改就行了:
[0-9]{4}年(((0[13578]
------解决思路----------------------
(10
------解决思路----------------------
12))月(0[1-9]
------解决思路----------------------
[1-2][0-9]
------解决思路----------------------
3[0-1]))
------解决思路----------------------
(02月(0[1-9]
------解决思路----------------------
[1-2][0-9]))
------解决思路----------------------
((0[469]
------解决思路----------------------
11)月(0[1-9]
------解决思路----------------------
[1-2][0-9]
------解决思路----------------------
30)))日
------解决思路----------------------
可以用SimpleDateFormat("yyyy年mm月dd日")
------解决思路----------------------
应该先判断是否是闰年.然后再对应的编写闰年和非闰年的正则即可了.
------解决思路----------------------
不知道需求是啥,在一堆东西里面找日期?....
一般好像没用正则这个方法来匹配日期的
不然还要向楼上说的那样看闰年还要根据月份确定日期天数
------解决思路----------------------
[code=java
package net.csdn.question;
//http://bbs.csdn.net/topics/391836999

//判断日期形势是否有效:假设日期形式为: yyyy-mm-dd(注:这里的yyyy不一定是四位数)
//主要需要判断年份是否为闰年,然后对闰年及非闰年进行分开判断有效性

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

public class DateFormatValid {
public static void main(String[] args) {
String[] dates = new String[7];
dates[0] = "12452-July-3th";// 不符合yyyy-mm-dd格式 Invalid
dates[1] = "2015-10-32";// 日期超过31 Invalid
dates[2] = "2015-13-21";// 月份超过12 Invalid
dates[3] = "2015-02-29";// 非闰年,二月份29 Invalid
dates[4] = "2012-02-29";// 闰年,二月份29 Valid
dates[5] = "2015-01-31";// 一月份31 Valid
dates[6] = "2015-04-30";// 四月份30 Valid
String date = null;
for (int i = 0; i < dates.length;) {
date = dates[i];
System.out.print((++i) + ": ");
if (isValid(date)) {
System.out.println("\"" + date + "\" 是有效的日期!");
} else {
System.out.println("\"" + date + "\" 不是有效日期!");
}
}
}

public static boolean isValid(String date) {
String regex = "(\\d+)-\\d{2}-\\d{2}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(date);
if (!matcher.matches()) {
System.out.print("你所提供的数据:\"" + date + "\" 不符合标准格式yyyy-mm-dd  ");
return false;
}
String year = matcher.group(1);
boolean isLeapYear = isLeapYear(year);
year = "^\\d+-";
String md31 = "((0[13578]
------解决思路----------------------
1[02])-(0[1-9]
------解决思路----------------------
[12]\\d
------解决思路----------------------
3[01])$)";
String md30 = "((0[469]
------解决思路----------------------
11)-(0[1-9]
------解决思路----------------------
[12]\\d
------解决思路----------------------
30)$)";
String md_2 = null;
if (isLeapYear) {
md_2 = "(02-(0[1-9]
------解决思路----------------------
[12]\\d)$)";
} else {
md_2 = "(02-(0[1-9]
------解决思路----------------------
1\\d
------解决思路----------------------
2[0-8])$)";
}
regex = year + "(" + md31 + "
------解决思路----------------------
" + md30 + "
------解决思路----------------------
" + md_2 + ")";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(date);
return matcher.matches();
}

public static boolean isLeapYear(String year) {
return (int) new Integer(year) % 4 == 0;
}
}
]
[/code]
------解决思路----------------------

package net.csdn.question;
//http://bbs.csdn.net/topics/391836999

//判断日期形势是否有效:假设日期形式为: yyyy-mm-dd(注:这里的yyyy不一定是四位数)
//主要需要判断年份是否为闰年,然后对闰年及非闰年进行分开判断有效性

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

public class DateFormatValid {
public static void main(String[] args) {
String[] dates = new String[7];
dates[0] = "12452-July-3th";// 不符合yyyy-mm-dd格式 Invalid
dates[1] = "2015-10-32";// 日期超过31 Invalid
dates[2] = "2015-13-21";// 月份超过12 Invalid
dates[3] = "2015-02-29";// 非闰年,二月份29 Invalid
dates[4] = "2012-02-29";// 闰年,二月份29 Valid
dates[5] = "2015-01-31";// 一月份31 Valid
dates[6] = "2015-04-30";// 四月份30 Valid
String date = null;
for (int i = 0; i < dates.length;) {
date = dates[i];
System.out.print((++i) + ": ");
if (isValid(date)) {
System.out.println("\"" + date + "\" 是有效的日期!");
} else {
System.out.println("\"" + date + "\" 不是有效日期!");
}
}
}

public static boolean isValid(String date) {
String regex = "(\\d+)-\\d{2}-\\d{2}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(date);
if (!matcher.matches()) {
System.out.print("你所提供的数据:\"" + date + "\" 不符合标准格式yyyy-mm-dd  ");
return false;
}
String year = matcher.group(1);
boolean isLeapYear = isLeapYear(year);
year = "^\\d+-";
String md31 = "((0[13578]
------解决思路----------------------
1[02])-(0[1-9]
------解决思路----------------------
[12]\\d
------解决思路----------------------
3[01])$)";
String md30 = "((0[469]
------解决思路----------------------
11)-(0[1-9]
------解决思路----------------------
[12]\\d
------解决思路----------------------
30)$)";
String md_2 = null;
if (isLeapYear) {
md_2 = "(02-(0[1-9]
------解决思路----------------------
[12]\\d)$)";
} else {
md_2 = "(02-(0[1-9]
------解决思路----------------------
1\\d
------解决思路----------------------
2[0-8])$)";
}
regex = year + "(" + md31 + "
------解决思路----------------------
" + md30 + "
------解决思路----------------------
" + md_2 + ")";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(date);
return matcher.matches();
}

public static boolean isLeapYear(String year) {
return (int) new Integer(year) % 4 == 0;
}
}


------解决思路----------------------
如果不是很严格的话就直接用最简单的就行了,如果一定要限制死的话,你要考虑闰年,月份等这种要求的话,单独的一个正则很难表达
------解决思路----------------------
如果题目要求的是 yyyy年mm月dd日 的格式的话那么用如下的

//package net.csdn.question;

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

public class Test{
public static void main(String[] args){
String year = "^\\d+年";
String md31 = "((0[13578]
------解决思路----------------------
1[02])月(0[1-9]
------解决思路----------------------
[12]\\d
------解决思路----------------------
3[01])日$)";
        String md30 = "((0[469]
------解决思路----------------------
11)月(0[1-9]
------解决思路----------------------
[12]\\d
------解决思路----------------------
30)日$)";
String md_2_Leap = "(02月(0[1-9]
------解决思路----------------------
[12]\\d)日$)";
String md_2_NLeap = "(02月(0[1-9]
------解决思路----------------------
1\\d
------解决思路----------------------
2[0-8])日$)";
String leap = year + "(" + md31 + "
------解决思路----------------------
" + md30 + "
------解决思路----------------------
" + md_2_Leap + ")";//这个是闰年的
String noLeap = year + "(" + md31 + "
------解决思路----------------------
" + md30 + "
------解决思路----------------------
" + md_2_NLeap + ")";//这个是非闰年的

String date = "2012年02月29日";
Pattern pattern = Pattern.compile(leap);//这里根据需要加载对应是否闰年的表达式
Matcher matcher = pattern.matcher(date);
if(matcher.matches()){
System.out.println("\"" + date + "\" is valid date!");
System.exit(0);
}

System.out.println("\"" + date + "\" isn't valid date!");
}
}

------解决思路----------------------
少年,try try this

public class Test {
public void test(String parm){
// 没加时间验证的YYYY-MM-DD
String regex = "^((((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?[13456789]
------解决思路----------------------
1[012])-(0?[1-9]
------解决思路----------------------
[12]\\d
------解决思路----------------------
30))
------解决思路----------------------
(((1[6-9]
------解决思路----------------------
[2-9]\\d)\\d{2})-0?2-(0?[1-9]
------解决思路----------------------
1\\d
------解决思路----------------------
2[0-8]))
------解决思路----------------------
(((1[6-9]
------解决思路----------------------
[2-9]\\d)(0[48]
------解决思路----------------------
[2468][048]
------解决思路----------------------
[13579][26])
------解决思路----------------------
((16
------解决思路----------------------
[2468][048]
------解决思路----------------------
[3579][26])00))-0?2-29-))$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(parm);
System.out.println(parm + ":" + m.matches());
}
public static void main(String[] args) {
Test t = new Test();
t.test("2015-10-10");
t.test("2008-2-29");
t.test("2008-2-28");
t.test("2015-13-10");
t.test("2015-1-35");
}
}
  相关解决方案