Regex 在Perl中将YYYYMMDD日期拆分为3部分
如何将格式为YYYYMMDD的日期拆分为其组成部分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
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;