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

Regex 正则表达式以小时分钟和秒为单位获取时间,regex,perl,datetime,Regex,Perl,Datetime,我得到的时间是这种格式的12/Jul/2016:13:26:23 现在我想用13小时26分23秒来计算时间 如何在Perl中通过正则表达式实现这一点?我试过了,但是我做不到 $line =~ /^.+?\:(.+)/ 请在这方面帮助我,我们如何做到这一点。这应该可以完成工作: $line =~ /\d+\/\w+\/\d{4}:(\d+):(\d+):(\d+)/ 1美元包含小时数 $2分钟和$3秒这应该可以完成任务: $line =~ /\d+\/\w+\/\d{4}:(\d+):(\d+

我得到的时间是这种格式的
12/Jul/2016:13:26:23

现在我想用
13小时26分23秒来计算时间

如何在Perl中通过正则表达式实现这一点?我试过了,但是我做不到

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

请在这方面帮助我,我们如何做到这一点。

这应该可以完成工作:

$line =~ /\d+\/\w+\/\d{4}:(\d+):(\d+):(\d+)/
1美元包含小时数
$2分钟和$3秒

这应该可以完成任务:

$line =~ /\d+\/\w+\/\d{4}:(\d+):(\d+):(\d+)/
1美元包含小时数
$2分钟和$3秒

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

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 "@hms\n";
用问题中的字符串打印
13 26 23
。这将通过
/g
修饰符重复捕获冒号后面的所有连续数字。 因此
@hms
包含:小时、分钟、秒

此外,如果您的格式是蚀刻在石头上,这是简单的使用

在这里,我们捕获通过在
上拆分获得的最后三项。如果您需要捕获所有部分,那么使用
split
中的模式规范获取完整的正则表达式这一事实,因此

my @parts = split /[:\/]/, $line;
返回(并分配给
@parts
)列表
2016年7月12日13 26 23



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

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

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 "@hms\n";
用问题中的字符串打印
13 26 23
。这将通过
/g
修饰符重复捕获冒号后面的所有连续数字。 因此
@hms
包含:小时、分钟、秒

此外,如果您的格式是蚀刻在石头上,这是简单的使用

在这里,我们捕获通过在
上拆分获得的最后三项。如果您需要捕获所有部分,那么使用
split
中的模式规范获取完整的正则表达式这一事实,因此

my @parts = split /[:\/]/, $line;
返回(并分配给
@parts
)列表
2016年7月12日13 26 23



†我在用
\d
作弊,因为它比[
0-9]
短,而且重复了很多次。但请注意,
\d
支持Unicode,因此它匹配各种“数字”——几百个不同的字符。因此,请将那些
\d
替换为
[0-9]

您已经拥有的正则表达式解决方案,但只是为了比较,下面是我将如何使用它们


您已经拥有的regex解决方案工作得很好,但为了进行比较,以下是我将如何使用它


执行此操作的最简单方法之一是扫描日期时间字符串中的“word”字符序列,其中包括所有数字和字母以及下划线字符。这将返回所有字段的值,您可以随意使用它们

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;
输出
执行此操作的最简单方法之一是扫描日期时间字符串中的“word”字符序列,其中包括所有数字和字母以及下划线字符。这将返回所有字段的值,您可以随意使用它们

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;
输出
my$str=“11/Jul/2016:04:38:05”$str=~/\d+\/\w\/\d{4}:(\d+):(\d+):(\d+)/;打印$1。”——“$2。”——“$3;这不是working@Developer参见我的更改答案my$str=“11/Jul/2016:04:38:05”$str=~/\d+\/\w\/\d{4}:(\d+):(\d+):(\d+)/;打印$1。”——“$2。”——“$3;这不是working@Developer看到我的衣服了吗answer@Borodin非常感谢你。“那真的不对劲。”博罗丁非常感谢你。那真的不对劲。