Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 什么';s是一个Perl正则表达式,用于转换日期,如';2012年12月26日12:00AM';到yyyymmdd?_Regex_Perl_Datetime_Type Conversion - Fatal编程技术网

Regex 什么';s是一个Perl正则表达式,用于转换日期,如';2012年12月26日12:00AM';到yyyymmdd?

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正则表达式,但在做其他部分的时候,我没有时间去阅读和理解它。昨天我已经浪

我已经非常努力地使用PerlRegex找到了这种特殊转换(这些日期格式)的示例,但没有成功。有人能帮我在这些格式之间转换日期吗

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{{错误处理}