关于日期的正则表达式如何写?

关于日期的正则表达式如何写?

比如匹配: xxxx-xx-xx 形式?


QUOTE:
原帖由 justin764 于 2008-12-12 10:02 发表
比如匹配: xxxx-xx-xx 形式?

m/\d{1,4}-\d{1,2}-\d{1,2}/


QUOTE:
原帖由 MMMIX 于 2008-12-12 10:49 发表

m/\d{1,4}-\d{1,2}-\d{1,2}/

上述表达式显然不行,没考虑月和日的限制,月只能是01-12,日只能是01-31,并且有些月只有28、29、30天
sub isvaliddate {
  my $input = shift;
  if ($input =~ m!^((?:19|20)\d\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$!) {
    # At this point, $1 holds the year, $2 the month and $3 the day of the date entered
    if ($3 == 31 and ($2 == 4 or $2 == 6 or $2 == 9 or $2 == 11)) {
      return 0; # 31st of a month with 30 days
    } elsif ($3 >= 30 and $2 == 2) {
      return 0; # February 30th or 31st
    } elsif ($2 == 2 and $3 == 29 and not ($1 % 4 == 0 and ($1 % 100 != 0 or $1 % 400 == 0))) {
      return 0; # February 29th outside a leap year
    } else {
      return 1; # Valid date
    }
  } else {
    return 0; # Not a date
  }
}

not mine....


QUOTE:
原帖由 justin764 于 2008-12-12 11:07 发表



上述表达式显然不行,没考虑月和日的限制,月只能是01-12,日只能是01-31,并且有些月只有28、29、30天

这些在匹配成功后再验证就行了。Perl 5 的 regexp 好像是不能附加其他的代码,Perl 6 是啥情况还不清楚。


QUOTE:
原帖由 cobrawgl 于 2008-12-12 11:17 发表
sub isvaliddate {
  my $input = shift;
  if ($input =~ m!^((?:19|20)\d\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$!) {
    # At this point, $1 holds the year, $2 the month and $3 th ...

倒~,这么说只能写上一堆判断来验证了?没法一个表达式来验证了


QUOTE:
原帖由 cobrawgl 于 2008-12-12 11:17 发表
sub isvaliddate {
  my $input = shift;
  if ($input =~ m!^((?:19|20)\d\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$!) {
    # At this point, $1 holds the year, $2 the month and $3 th ...

我这么感觉这是在制造问题而不是解决问题?


QUOTE:
原帖由 justin764 于 2008-12-12 11:21 发表



倒~,这么说只能写上一堆判断来验证了?没法一个表达式来验证了

找些现成的模块来用吧
自己写个函数判断一下不就行了?


QUOTE:
原帖由 cobrawgl 于 2008-12-12 11:17 发表
sub isvaliddate {
  my $input = shift;
  if ($input =~ m!^((?:19|20)\d\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$!) {
    # At this point, $1 holds the year, $2 the month and $3 th ...

挺强大