如何使用类模式验证日期?

时间:2013-03-05 03:37:48

标签: java

我使用类模式(java.util.regex.Pattern)的简单知识制作了这段代码。当然,对于从0000-00-009999-12-31的所有实际日期,它都会返回true。但不幸的是,它仍然适用于2013-22-01,2013-01-99 ,. 。 。等等。帮我验证一下。

String regex = "([0-9]){4}+([-])?([0-2]){2}+([-])?([0-9]){2}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(textFieldName.getText());
return matcher.find();

5 个答案:

答案 0 :(得分:1)

虽然使用DateFormat将非常优越,但this会让您指向正确的方向。

在Debuggex上解释了([0-9]){4}(-[0-1][1-2]-([0-2][1-9]|3[0-1]))所做的事情,但这里是快速而又肮脏的问题。

  • 允许四组数字0-9。
  • 提供隐含的破折号。
  • 允许一组0或1。
  • 允许一组1-2。
  • 提供隐含的破折号。
  • 或者:
    • 允许一组数字0-2和1-9,或
    • 允许一组隐含的3和0-1。

你将获得二月份的有趣日期,但总的来说这会让你朝着正确的方向前进。更多正则表达式技巧,你可以涵盖所有月份和闰年。

答案 1 :(得分:0)

注意:我认为由于某种原因,您无法使用DateFormat类,这是匹配日期格式最简单的方法。

一种方法是提供可以匹配的事物列表。例如,您想要的月数为" 0和1到9"或" 1的数字以及0到2&#34的数字;

这样就可以完成(仅限于几个月):

(0[1-9]|1[0-2])

这可以让您了解如何完成正则表达式。

不幸的是,在这些日子里,它变得更加复杂,因为天数从一天到另一天不等。应该做的只是匹配2个整数,然后使用Matcher.group(int)方法从匹配器中取出组,并手动验证该值。

另一种方法是摆脱所有这一切,简单地分开" - "与String.split(String)。然后你检查你有三个子部分,它们都可以被解析为整数,并且它们的值是一致的。但它只是为了好玩:你应该真的使用DateFormat

答案 2 :(得分:0)

使用此正则表达式

String reg = "\\^(19|20)\\d\\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$";

Refference

答案 3 :(得分:0)

boolean matches = s.matches("\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])");

可以让它知道每个月有多少天,但是让正则表达式意识到闰年是不可能的

答案 4 :(得分:-1)

基于你已经拥有的东西:

String regex = "([0-9]){4}+([-])?([0-1][0-2])+([-])?([0-2][0-9]|3[0-1])";