关于正则表达式,还有一个关于日期格式的校验

时间:2022-05-06 14:03:13
日期数据值要正确,不能出现超出常规的日期,如“2007-2-30”。且符合’yyyy-mm-dd’、’yyyy-m-d’等格式。类似’mm-dd-yyyy’、’mm/dd/yyyy’、’mm.dd.yyyy’、’yyyy/mm/dd’、’yyyy.mm.dd’都是不合法的。
不是从web传入,所以不能用js的方法。谢谢各位

18 个解决方案

#1


用正则表达式看格式正确与否
然后用程序判断是不是合法

如果不是web的,简单点通过SimpleDateFormat来parse一下,报错就是不正确

直接用正则表达式很难实现

#2


Title: Pattern Title [Details] [Test]  
Expression: (((0[1-9]|[12][0-9]|3[01])([-./])(0[13578]|10|12)([-./])(\d{4}))|(([0][1-9]|[12][0-9]|30)([-./])(0[469]|11)([-./])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([-./])(02)([-./])(\d{4}))|((29)(\.|-|\/)(02)([-./])([02468][048]00))|((29)([-./])(02)([-./])([13579][26]00))|((29)([-./])(02)([-./])([0-9][0-9][0][48]))|((29)([-./])(02)([-./])([0-9][0-9][2468][048]))|((29)([-./])(02)([-./])([0-9][0-9][13579][26])))  
  
Description: Jason West (jason.west@mail.state.ky.us) date validator with leap years using a strict dd/mm/yyyy (ITALIAN) format 
Matches: 29/02/2000|||31/01/2000|||30-01-2000 
Non-Matches: 29/02/2002|||32/01/2002|||10/2/2002 

#3


hdhmail2000(禅剑飞雪) ( ) 信誉:100    Blog 

这个东西哪里找过来的?

怎么这么精辟啊?

#4


要不要考虑闰年和公元0年?

#5


hdhmail2000(禅剑飞雪)可以写的更具体一点吗?
DeRoshia(知秋一叶):这个就不用了,如果出现这种情况,也只能说用户不按规矩办事了。

#6


date validator with leap years 
这不写了吗?考虑闰年的了
另外时间的间隔可以为-./
同时注意它的格式,他的西方式的,你可以改下,嫌麻烦你可以用这个办法来做,验证的时候把那个年、月、日按你的方式取出来(判断是"-"还是"."还是"/"就可以(indexof就可以),然后再用split就能得到),然后组合成 dd/mm/yyyy给这个正则表达式验证,应该不难了

#7


^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$
不考虑闰年和公元0年等的
没有hdhmail2000(禅剑飞雪)的考虑全面
但按你的要求估计够用了

#8


try {
      if (要验证的字符串.matches(正则表达式)) {
        System.out.println("The regex matches your string");
      }
      else {
        System.out.println("The regex does not match your string");
      }
    } catch (PatternSyntaxException ex) {
      System.out.println("You have an error in your regular expression:\n" +
                          ex.getDescription());
}
//java怎么用正则表达式的

#9


这是一个从EXCEL表导入的校验,只允许日期符合’yyyy-mm-dd’、’yyyy-m-d’格式

小弟我对hdhmail2000(禅剑飞雪)给的这个表达式一点都看不懂,不知道如何去动手,又不能baidu,google,痛苦啊

另外DeRoshia(知秋一叶) 的表达式支持合’yyyy-mm-dd’,但是不支持’yyyy-m-d’格式

#10


不能沉,救命啊

#11


不知如何下手?不是都写得很明白了吗?      if (要验证的字符串.matches(正则表达式)) {
这里的正则表达式就是那一长串,带进去不就完了?

#12


我试过了,这样做是不对的,无论写什么样的日期,返回的都是false

#13


Title: y/m/d Date [Details] [Test]  
Expression: ^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\/|-|\.)(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(\/|-|\.)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8]))))$  
  
Description: This expression validates dates in the y/m/d format from 1600/1/1 - 9999/12/31. Follows the same validation rules for dates as my other date validator (m/d/y format) located in this library. 
Matches: 04/2/29|||2002-4-30|||02.10.31 
Non-Matches: 2003/2/29|||02.4.31|||00/00/00 

这个更适合你一点

#14


对了注意加上前面的^和后面的$

#15


String str = "2007-02-20";
String regx = "^(?:(?:(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\\/|-|\\.)(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\\d)?\\d{2})(\\/|-|\\.)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\\d|2[0-8]))))$";
         if (str.matches(regx))
{
System.out.println("true");
System.out.println("符合格式");
}
else
{
         System.out.println("false");
System.out.println("不符合格式");
}

我写的有什么问题吗?

#16


另外DeRoshia(知秋一叶) 的表达式支持合’yyyy-mm-dd’,但是不支持’yyyy-m-d’格式
---------------------------------------------------------------
^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1])$
呵呵,这部就支持了吗


import java.util.regex.*;

// 表达式对象
Pattern p = Pattern.compile("^\\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1])$");

// 创建 Matcher 对象
Matcher m = p.matcher("your string");

// 是否找到匹配
boolean found = m.find();

if( found )
{
    String foundstring = m.group();
    int    beginPos    = m.start();
    int    endPos      = m.end();
}

#17


如果是写一个类似boolean isDate(String)的方法,还是用SimpleDateFormat,通过setLenient,来check,正则太困难了。比如“历史上丢失的10天”什么的,而且楼上那么长的一个正则,直接用String.matches而不是保留一个编译好的Pattern,效率堪忧

#18


我试了试,mm/dd/yyyy的都不好用

#1


用正则表达式看格式正确与否
然后用程序判断是不是合法

如果不是web的,简单点通过SimpleDateFormat来parse一下,报错就是不正确

直接用正则表达式很难实现

#2


Title: Pattern Title [Details] [Test]  
Expression: (((0[1-9]|[12][0-9]|3[01])([-./])(0[13578]|10|12)([-./])(\d{4}))|(([0][1-9]|[12][0-9]|30)([-./])(0[469]|11)([-./])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([-./])(02)([-./])(\d{4}))|((29)(\.|-|\/)(02)([-./])([02468][048]00))|((29)([-./])(02)([-./])([13579][26]00))|((29)([-./])(02)([-./])([0-9][0-9][0][48]))|((29)([-./])(02)([-./])([0-9][0-9][2468][048]))|((29)([-./])(02)([-./])([0-9][0-9][13579][26])))  
  
Description: Jason West (jason.west@mail.state.ky.us) date validator with leap years using a strict dd/mm/yyyy (ITALIAN) format 
Matches: 29/02/2000|||31/01/2000|||30-01-2000 
Non-Matches: 29/02/2002|||32/01/2002|||10/2/2002 

#3


hdhmail2000(禅剑飞雪) ( ) 信誉:100    Blog 

这个东西哪里找过来的?

怎么这么精辟啊?

#4


要不要考虑闰年和公元0年?

#5


hdhmail2000(禅剑飞雪)可以写的更具体一点吗?
DeRoshia(知秋一叶):这个就不用了,如果出现这种情况,也只能说用户不按规矩办事了。

#6


date validator with leap years 
这不写了吗?考虑闰年的了
另外时间的间隔可以为-./
同时注意它的格式,他的西方式的,你可以改下,嫌麻烦你可以用这个办法来做,验证的时候把那个年、月、日按你的方式取出来(判断是"-"还是"."还是"/"就可以(indexof就可以),然后再用split就能得到),然后组合成 dd/mm/yyyy给这个正则表达式验证,应该不难了

#7


^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$
不考虑闰年和公元0年等的
没有hdhmail2000(禅剑飞雪)的考虑全面
但按你的要求估计够用了

#8


try {
      if (要验证的字符串.matches(正则表达式)) {
        System.out.println("The regex matches your string");
      }
      else {
        System.out.println("The regex does not match your string");
      }
    } catch (PatternSyntaxException ex) {
      System.out.println("You have an error in your regular expression:\n" +
                          ex.getDescription());
}
//java怎么用正则表达式的

#9


这是一个从EXCEL表导入的校验,只允许日期符合’yyyy-mm-dd’、’yyyy-m-d’格式

小弟我对hdhmail2000(禅剑飞雪)给的这个表达式一点都看不懂,不知道如何去动手,又不能baidu,google,痛苦啊

另外DeRoshia(知秋一叶) 的表达式支持合’yyyy-mm-dd’,但是不支持’yyyy-m-d’格式

#10


不能沉,救命啊

#11


不知如何下手?不是都写得很明白了吗?      if (要验证的字符串.matches(正则表达式)) {
这里的正则表达式就是那一长串,带进去不就完了?

#12


我试过了,这样做是不对的,无论写什么样的日期,返回的都是false

#13


Title: y/m/d Date [Details] [Test]  
Expression: ^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\/|-|\.)(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(\/|-|\.)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8]))))$  
  
Description: This expression validates dates in the y/m/d format from 1600/1/1 - 9999/12/31. Follows the same validation rules for dates as my other date validator (m/d/y format) located in this library. 
Matches: 04/2/29|||2002-4-30|||02.10.31 
Non-Matches: 2003/2/29|||02.4.31|||00/00/00 

这个更适合你一点

#14


对了注意加上前面的^和后面的$

#15


String str = "2007-02-20";
String regx = "^(?:(?:(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\\/|-|\\.)(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\\d)?\\d{2})(\\/|-|\\.)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[1,3-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\\d|2[0-8]))))$";
         if (str.matches(regx))
{
System.out.println("true");
System.out.println("符合格式");
}
else
{
         System.out.println("false");
System.out.println("不符合格式");
}

我写的有什么问题吗?

#16


另外DeRoshia(知秋一叶) 的表达式支持合’yyyy-mm-dd’,但是不支持’yyyy-m-d’格式
---------------------------------------------------------------
^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1])$
呵呵,这部就支持了吗


import java.util.regex.*;

// 表达式对象
Pattern p = Pattern.compile("^\\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1])$");

// 创建 Matcher 对象
Matcher m = p.matcher("your string");

// 是否找到匹配
boolean found = m.find();

if( found )
{
    String foundstring = m.group();
    int    beginPos    = m.start();
    int    endPos      = m.end();
}

#17


如果是写一个类似boolean isDate(String)的方法,还是用SimpleDateFormat,通过setLenient,来check,正则太困难了。比如“历史上丢失的10天”什么的,而且楼上那么长的一个正则,直接用String.matches而不是保留一个编译好的Pattern,效率堪忧

#18


我试了试,mm/dd/yyyy的都不好用