Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 在Perl中将YYYYMMDD日期拆分为3部分_Regex_Perl_Datetime - Fatal编程技术网

Regex 在Perl中将YYYYMMDD日期拆分为3部分

Regex 在Perl中将YYYYMMDD日期拆分为3部分,regex,perl,datetime,Regex,Perl,Datetime,如何将格式为YYYYMMDD的日期拆分为其组成部分 my ($yyyy, $mm, $dd) = $date =~ /(\4d+)(\2d+)(\2d+)/; 请注意,这将查找正则表达式中的第一个日期,它不适用于2010063011,因为它不是一个日期,但它将适用于20100630,这正是您想要的 my ($year, $month, $day) = unpack "A4A2A2", $date; pack和unpack是未充分使用的内置代码,可以大功率使用。请注意\d匹配任何Unicode

如何将格式为YYYYMMDD的日期拆分为其组成部分

my ($yyyy, $mm, $dd) = $date =~ /(\4d+)(\2d+)(\2d+)/;
请注意,这将查找正则表达式中的第一个日期,它不适用于
2010063011
,因为它不是一个日期,但它将适用于
20100630
,这正是您想要的

my ($year, $month, $day) = unpack "A4A2A2", $date;

pack
unpack
是未充分使用的内置代码,可以大功率使用。

请注意\d匹配任何Unicode数字,而不仅仅是拉丁十进制数字


因此,如果要进行输入验证,请使用“[0-9]”而不是“\d”。

每当需要处理日期时,我都会使用DateTime模块。你可以从CPAN那里拿到它

也许是
$
而不是
\z
?我可以用o来代替吗?我还另外两次使用它(虽然不是在循环中)@syker:请查看有关正则表达式语法的详细信息(例如,z、$、\d和其他组件的含义)。@syker:@jdehaan:
$
表示字符串的结尾或\n然后是字符串的结尾。因为指定的格式不应该有\n,所以我使用了\z@syker:o与此无关-我不理解您的建议,因为replaceunpack是perl提供的最快的数据,特别是对于固定宽度的数据。您可以使用unpack进行错误检查吗?例如:在那之后有一个或“死”的错误格式的陈述吗?强大但贫穷validation@ysth:使用regexp也无法正确验证。它将允许9999-99-99作为日期,即使这显然不是一个有效的日期。这取决于
$date
的存储方式,
unpack
仅适用于固定宽度。在我的例子中,如果除了8位数字(偶数空格)之外还有任何其他文本,则
unpack
将中断。这就是为什么我的答案使用
\b
添加了一些预验证。您的方法与unpack方法相比是有意义的,感谢您在
unpack
答案中添加了该注释
#!/usr/bin/perl -w

use strict;

   sub main{
      my $date = "some text with the numbers 2010063011 and more text";
      print "Input Date: $date\n";

      my ($year, $month, $day) = $date =~ /\b(\d{4})(\d{2})(\d{2})\b/;      
      print qq{
               Date:  $date
               Year:  $year
               Month: $month
               Day:   $day\n} if (defined $year && defined $month && defined $day);
   }

   main();
my ($year, $month, $day) = unpack "A4A2A2", $date;