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

Perl 如何从文件名中提取YYYYMMDD格式的日期信息?,perl,Perl,我是Perl新手,有一个格式为XXXX\u XXX\u YYYYMMDD.txt的字符串 如何提取另一个字符串中的YYYYMMDD部分 下面是我试过的 my $filename = "XXXX_XXX_YYYYMMDD.txt"; my $datepart = split($filename ,'.'); print "$datepart"; my$datepart创建列表上下文。列表上下文中的正则表达式匹配返回捕获组。部件/../是一个捕获组。在内部,您将匹配第4年数字、第2个月数字和第2天

我是Perl新手,有一个格式为XXXX\u XXX\u YYYYMMDD.txt的字符串

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

下面是我试过的

my $filename = "XXXX_XXX_YYYYMMDD.txt";
my $datepart = split($filename ,'.');
print "$datepart";
my$datepart创建列表上下文。列表上下文中的正则表达式匹配返回捕获组。部件/../是一个捕获组。在内部,您将匹配第4年数字、第2个月数字和第2天数字,然后在字符串末尾匹配.txt扩展名

我这样做是为了便于更改为:

 my ($year, $month, $day) = ( 
      $filename =~ /([0-9]{4}) ([0-9]{2}) ([0-9]{2})[.]txt\z/x
 );
如果您决定需要单独安装组件。如果您只需要YYYYMMDD

也会起作用

另见

使用拆分“.”的问题很简单:拆分的第一个参数是模式。以某种模式。是特殊的:它意味着匹配任何字符。如果您使用split/[.]/,则会将。在字符类中,删除特殊含义,并将其视为与自身匹配的字符。出于美观的原因,我更喜欢拆分/\/或拆分{.}`


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

下面是一个正则表达式,它可以实现以下功能:

/.{4}_.{3}_(.{8})/;
下面是实际行动:

"abcd_efg_12340322.txt" =~ /.{4}_.{3}_(.{8})/; 
print $1;
括号捕获字符串并将其放入$1中

注意:正则表达式在任何语言中都会变得很糟糕,这个正则表达式很容易出错,但是如果你想做一些快速而肮脏的事情,它可能没问题


关于perl正则表达式有很多信息:

另一种方法是使用substr

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

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

使用


在下划线和句点上拆分字符串,并用下标获取第三个字段。

您尝试了什么?查看正则表达式,例如m/?分裂还有什么吗?是的,只要把绳子分开就行了。看看perldoc-f split.@SachinChourasiya-哦,我的反对票,以及我对结束这个问题的投票,一点也不愚蠢。请不要如此居高临下和傲慢地认为那些不同意你意见的人是无意识地这么做的。@SachinChourasiya-split$filename,“.”是你的问题。请查看perldoc-f split,了解split函数的语法。@SachinChourasiya这是一件好事,该网站是关于问题而不是海报的,因为你称我们无脑太愚蠢了。FWIW,在你发布了一段代码后,我撤回了我的否决票。但是,我同意Jack Maney对你评论的回应。谢谢Sinan,你能告诉我进展如何吗?谢谢Sinan,感谢你的解释。我投票给你:谢谢马特,你能告诉我它是如何工作的吗?@SachinCHourasiya-我已经测试过了,它在我的电脑上工作得很好。我担心的是边缘情况-如果一天或一个月只有一个数字怎么办?也许这是不可能的??如果您不担心遇到边缘大小写,那么应该没问题。通过匹配字符串中的任何字符,您完全消除了使用正则表达式的优势。你的模式也会匹配:嘿,我知道你不想要这个。@Sinan-你肯定是对的,它会匹配很多东西,但这就是问题的目的。为我辩护,我确实说过它很容易出错。但在我看来,OP可能在寻找一个快速的'n dirty.@SinanÜnür,正则表达式匹配有两个主要用途:验证和数据提取。您的示例文件名与OP的模式不匹配,因此Matt的模式是否匹配并不重要。OP要求的是数据提取,而不是数据验证。+1,这可能是最简单的答案!
"abcd_efg_12340322.txt" =~ /.{4}_.{3}_(.{8})/; 
print $1;
my $txt = "abcd_efg_12340322.txt";
print substr($txt, 9, 8);
$date = (split /[_.]/, $filename)[2];