加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 一个“智能”(宽容)日期解析器?

发布时间:2020-12-14 02:30:09 所属栏目:百科 来源:网络整理
导读:我必须将一个非常大的数据集从一个系统迁移到另一个系统.其中一个“源”列包含日期,但实际上是一个没有约束的字符串,而目标系统要求格式为yyyy-mm-dd的日期. 许多(但不是全部)源日期格式为yyyymmdd.所以为了强制它们达到预期的格式,我做(在Perl中): return
我必须将一个非常大的数据集从一个系统迁移到另一个系统.其中一个“源”列包含日期,但实际上是一个没有约束的字符串,而目标系统要求格式为yyyy-mm-dd的日期.

许多(但不是全部)源日期格式为yyyymmdd.所以为了强制它们达到预期的格式,我做(在Perl中):

return "$1-$2-$3" if ($val =~ /(d{4})[-/]*(d{2})[-/]*(d{2})/);

当源日期远离“通用”yyyymmdd时出现问题.目标是在放弃之前尽可能多地挽救日期.示例源字符串包括:

21/3/1998,
2004年3月,
2001年,
97年3月4日

我可以尝试通过一系列正则表达式(如上面的表达式)来匹配尽可能多的示例.

但有更聪明的事情吗?我不是在重新发明轮子吗?在某个地方有类似的东西吗?我找不到任何相关的谷歌搜索“原谅日期解析器”. (任何语言都可以).

Date::Manip是你的朋友,因为它只有四分之一的失败因为它采用美国格式,使用Date_Init你可以获得4中的4.

如果你有不同的格式(即前一个月,反之亦然)你必须以不同的方式解析它们,一次使用美国日期格式,另一种使用非美国日期格式.这很不明确,如你的3/4/97示例,因为如果它是21/3它只是失败,你可以告诉格式是错误的.

vinko@mithril:~$more date.pl
use strict;
use warnings;
use Date::Manip;

my @a;
push @a,"March 2004";
push @a,"2001";
push @a,"3/4/97";
push @a,"21/3/1998";
Date_Init("DateFormat=non-US");
for my $d (@a) {
    print "$dn";
    print ParseDate($d)."n";
};
vinko@mithril:~$perl date.pl
March 2004
2004030100:00:00
2001
2001010100:00:00
3/4/97
1997040300:00:00
21/3/1998
1998032100:00:00

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读