我是Perl的新手,并且有一个格式为XXXX_XXX_YYYYMMDD.txt
的字符串。
如何在另一个字符串中提取YYYYMMDD
部分?
以下是我尝试的内容
my $filename = "XXXX_XXX_YYYYMMDD.txt";
my $datepart = split($filename ,'.');
print "$datepart";
答案 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/ );
也会奏效。
使用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)