正则表达式 – 一个“智能”(宽容)日期解析器?
发布时间: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, 我可以尝试通过一系列正则表达式(如上面的表达式)来匹配尽可能多的示例. 但有更聪明的事情吗?我不是在重新发明轮子吗?在某个地方有类似的东西吗?我找不到任何相关的谷歌搜索“原谅日期解析器”. (任何语言都可以).
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |