正则表达式以小时分钟和秒为单位获取时间



我正在以这种格式12/Jul/2016:13:26:23获得时间。

现在我想像13Hour 26Min and 23Seconds一样得到时间.

我们如何在 Perl 中通过正则表达式做到这一点?我正在尝试这个,但我无法做到这一点

$line =~ /^.+?:(.+)/

请帮助我如何做到这一点。

您已经拥有的正则表达式解决方案运行良好,但只是为了进行比较,这是我使用 Time::P iece 的方法。

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Time::Piece;
my $date_str = '12/Jul/2016:13:26:23';
my $date_fmt = '%d/%b/%Y:%H:%M:%S';
my $date = Time::Piece->strptime($date_str, $date_fmt);
say $date->hour, ' hours, ', $date->minute, ' minutes, ',
    $date->second, ' seconds';

有一些最优秀的日期时间模块,但考虑到不寻常的输出格式和简单的输入,也许正则表达式是一个很好的解决方案。

my ($day, $mon, $year, $hour, $minute, $sec) = 
    $line =~ m{ (d+) / ([^/]+) / (d{4}):(d{2}):(d{2}):(d{2}) }x;

我使用了全局修饰符}x以便我可以使用空格来提高可读性,并{}分隔符/以便可以不转义地使用。现在随心所欲地打印出捕获。

或者,可以在输入字符串的相关部分中使用:分隔符

my @hms = $line =~ m/:(d+)/g;
print "@hmsn";

使用问题中的字符串,这打印13 26 23 . 这将捕获冒号的所有连续数字,由/g修饰符重复捕获。所以@hms包含:小时、分钟、秒。

此外,如果您的格式蚀刻在石头上,则使用拆分很简单

my @hms = (split /:/, $line)[-3..-1];

我们捕获通过拆分获得的最后三个项目 : . 如果您需要捕获所有部分,请使用 split 中的模式规范采用完整正则表达式的事实,因此

my @parts = split /[:/]/, $line;

返回(并分配给@parts)列表12 Jul 2016 13 26 23


我在用d作弊,因为它比 [ 0-9] 短,而且重复了很多次。但请注意,d是Unicode感知的,因此它匹配各种"数字" - 几百个不同的字符。因此,请将这些d替换为 [0-9] .

这应该可以完成工作:

$line =~ /d+/w+/d{4}:(d+):(d+):(d+)/

$1 包含小时数2 分钟和 3 秒

最简单的方法之一是扫描日期时间字符串以查找"单词"字符序列,其中包括所有数字和字母以及下划线字符。这将返回所有字段的值,您可以对它们执行任何操作

use strict;
use warnings 'all';
my $dt = '12/Jul/2016:13:26:23';
my ($day, $mon, $year, $h, $m, $s) = $dt =~ /w+/g;
printf "%dHour %dMin and %dSeconds.n", $h, $m, $s;

输出

13Hour 26Min and 23Seconds.

最新更新