如何从文件名中提取YYYYMMDD格式的日期信息?

时间:2011-10-20 21:40:04

标签: perl

我是Perl的新手,并且有一个格式为XXXX_XXX_YYYYMMDD.txt的字符串。

如何在另一个字符串中提取YYYYMMDD部分?

以下是我尝试的内容

my $filename = "XXXX_XXX_YYYYMMDD.txt";
my $datepart = split($filename ,'.');
print "$datepart";

4 个答案:

答案 0 :(得分:3)

另一种方法是使用substr()

my $txt = "abcd_efg_12340322.txt";
print substr($txt, 9, 8);

9表示从字符串的第10个字符开始(从0开始计数),8表示需要捕获的字符数。

答案 1 :(得分:1)

 my ($datepart) = ( $filename =~ /([0-9]{4}[0-9]{2}[0-9]{2})[.]txt\z/ );

my ($datepart)创建列表上下文。列表上下文中的正则表达式匹配返回捕获组。部分/(...)/是一个捕获组。在里面,您匹配年份(4位数),月份(2位数)和日期(2位数),然后是字符串末尾的.txt扩展名。

我是这样做的,因此很容易改为:

 my ($year, $month, $day) = ( 
      $filename =~ /([0-9]{4}) ([0-9]{2}) ([0-9]{2})[.]txt\z/x
 );

如果您决定单独需要这些组件。如果你想要的只是YYYYMMDD

 my ($datepart) = ( $filename =~ /([0-9]{8})[.]txt\z/ );

也会奏效。

另见perldoc perlretut

使用split '.'的问题很简单:split的第一个参数是一个模式。在模式中.是特殊的:它表示“匹配任何字符”。如果您使用split /[.]/进行拆分,则可以将.放入删除特殊含义的字符类中,并将其视为与自身匹配的字符。出于审美原因,我更倾向于split /\./split qr {。}`。

正如@TLP所示,在此示例中可以使用split来获取正确的部分,但最好使用m//来确保您只匹配要匹配的内容。

答案 2 :(得分:1)

这是一个正则表达式,可以解决这个问题:

/.{4}_.{3}_(.{8})/;

这就是行动:

"abcd_efg_12340322.txt" =~ /.{4}_.{3}_(.{8})/; 
print $1;

括号捕获字符串并将其放入$ 1。

注意:正则表达式可能会变得令人讨厌(使用任何语言)并且这个正则表达式很容易出错,但是如果你想快速做一些事情,那就可能没事了。

perl regexes上有很多信息:perldocs

答案 3 :(得分:1)

使用split

进行一些简单的字段操作
$date = (split /[_.]/, $filename)[2];

您将字符串拆分为下划线和句点,并使用下标获取第三个字段。