Regex 什么';s是一个Perl正则表达式,用于转换日期,如';2012年12月26日12:00AM';到yyyymmdd?
我已经非常努力地使用PerlRegex找到了这种特殊转换(这些日期格式)的示例,但没有成功。有人能帮我在这些格式之间转换日期吗Regex 什么';s是一个Perl正则表达式,用于转换日期,如';2012年12月26日12:00AM';到yyyymmdd?,regex,perl,datetime,type-conversion,Regex,Perl,Datetime,Type Conversion,我已经非常努力地使用PerlRegex找到了这种特殊转换(这些日期格式)的示例,但没有成功。有人能帮我在这些格式之间转换日期吗 Dec 26 2012 12:00AM ==> 201212126 下面是我最初的尝试,但它运行得太慢(很明显,我使用了substr 5次,这很可笑) 注意:这是为了工作,用于将输入文件转换为非常大的DB摄取,不幸的是,python在我选择的脚本语言平台上不受支持。我试着制作自己的Perl正则表达式,但在做其他部分的时候,我没有时间去阅读和理解它。昨天我已经浪
Dec 26 2012 12:00AM ==> 201212126
下面是我最初的尝试,但它运行得太慢(很明显,我使用了substr 5次,这很可笑)
注意:这是为了工作,用于将输入文件转换为非常大的DB摄取,不幸的是,python在我选择的脚本语言平台上不受支持。我试着制作自己的Perl正则表达式,但在做其他部分的时候,我没有时间去阅读和理解它。昨天我已经浪费了大部分时间编写Perl脚本,剩下的时间都在学习,这次转换花了我太长时间。我建议您使用module+
输出
Dec 26 2012 10:10AM -> 2012-12-26 10:10
我建议您使用模块+
输出
Dec 26 2012 10:10AM -> 2012-12-26 10:10
那么,2012年12月26日凌晨12:00<代码>的哪些部分是有趣的
Dec 26 2012 12:00 AM
$month $day $year $hour:$minute $pm
因此,我们只需定义平凡的正则表达式,捕获有趣的信息,并将它们放入适当的变量中:
my ($month, $day, $year, $hour, $minute, $pm)
= ($string =~ m{
(\w{3}) \s+ # 3 word characters
(\d{1,2}) \s+ # 1 or 2 digits
(\d{4}) \s+ # 4 digits
(\d{2}) : (\d{2}) (AM|PM) # the hour, minute and AM/PM context
}ix;
);
接下来,我们将月份设为数字,并使用AM/PM信息:
$month = {
Jan => 1,
Feb => 2,
...
Dec => 12,
}->{$month} or die "Unknown month $month";
$hour += $pm =~ /pm/i ? 12 : 0; # if $pm contains "pm", then add 12 h
然后,我们通过sprintf
构建一个适当的零填充字符串:
my $format_string = "%04d%02d%02d" . ($include_hour ? "%02d%02d" : "");
my $date = sprintf $format_string,
$year, $month, $day, $hour, $minute;
如果您有雄心壮志,您也可以轻松添加时区;-)
当输入类似于
16:00PM
时,此方法将产生奇怪的结果,因为它将2800
作为时间输出,这显然是错误的。如果这可能是一个问题,那么pm
仅更正如果$hour那么,2012年12月26日12:00AM
的哪些部分是有趣的
Dec 26 2012 12:00 AM
$month $day $year $hour:$minute $pm
因此,我们只需定义平凡的正则表达式,捕获有趣的信息,并将它们放入适当的变量中:
my ($month, $day, $year, $hour, $minute, $pm)
= ($string =~ m{
(\w{3}) \s+ # 3 word characters
(\d{1,2}) \s+ # 1 or 2 digits
(\d{4}) \s+ # 4 digits
(\d{2}) : (\d{2}) (AM|PM) # the hour, minute and AM/PM context
}ix;
);
接下来,我们将月份设为数字,并使用AM/PM信息:
$month = {
Jan => 1,
Feb => 2,
...
Dec => 12,
}->{$month} or die "Unknown month $month";
$hour += $pm =~ /pm/i ? 12 : 0; # if $pm contains "pm", then add 12 h
然后,我们通过sprintf
构建一个适当的零填充字符串:
my $format_string = "%04d%02d%02d" . ($include_hour ? "%02d%02d" : "");
my $date = sprintf $format_string,
$year, $month, $day, $hour, $minute;
如果您有雄心壮志,您也可以轻松添加时区;-)
当输入类似于16:00PM
时,此方法将产生奇怪的结果,因为它将2800
作为时间输出,这显然是错误的。如果这可能是一个问题,请仅在$hour一个正则表达式无法将Dec
转换为12
的情况下执行pm
更正。Perl中没有可用的日期解析函数吗?不要使用自己的函数。日期转换是一个已解决的问题。CPAN上有许多模块可以为您执行此操作,例如答案中引用的DateTime模块。仅正则表达式无法将Dec
转换为12
。Perl中没有可用的日期解析函数吗?不要使用自己的函数。日期转换是一个已解决的问题。CPAN上有许多模块可以为您执行此操作,例如答案中引用的DateTime模块。这是一段糟糕的代码,因为它缺少错误检查。在开始使用$1
等之前,您需要检查正则表达式是否实际匹配。此外,您还应该检查匹配的三个字符串是否为有效月份。i、 e.:if($str=~/^(\w{3})(\d{1,2})(\d{4})/and exists$months{1}){print$3.$months{1}.$2;}else{35; error handling}
这是一段糟糕的代码,因为它缺少错误检查。在开始使用$1
等之前,您需要检查正则表达式是否实际匹配。此外,您还应该检查匹配的三个字符串是否为有效月份。i、 e.:if($str=~/^(\w{3})(\d{1,2})(\d{4})/and exists$months{$1}){print$3.$months{$1}.$2;}else{{错误处理}