我有一个日志文件,可以按时间戳保存日志。我要做的是在时间范围之间读取某些值。例如,从文件的开头和5:3:55
。我不擅长正则表达式,我想知道如何编写表达式来阅读它。到目前为止,我已经得到了以下表达,这是不对的。任何样品如何正确写入?谢谢
([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)
具有范围解决方案的帖子无法满足我的需求,因为它需要一段时间并处理文件。虽然我需要从文件时间戳的开始到某些增量而不是某些单词匹配。谢谢
答案 0 :(得分:2)
不要将正则表达式用于数学!您可以使用它们来解析所有日期(例如,使用您在问题中包含的正则表达式),然后使用解析后的值对您给定的时间戳进行比较。这就像在词汇上比较数字一样。
如果您确实需要匹配 5:3:34 和 5:3:55 之间的每个日期的正则表达式,则需要分别匹配所有可能的数字:
/5:3:(3[4-9]|4[0-9]|5[0-5])/
答案 1 :(得分:1)
你需要的不仅仅是一个正则表达式(至少要做出理智的解决方案)。这是一个示例程序,演示了Perl中的简单解决方案:
use warnings;
use strict;
my $time_min = '08:19:48';
my $time_max = '12:30:48';
while (1)
{
print "enter time: ";
chomp($_ = <STDIN>);
if (time_numeric($_) <= time_numeric($time_max) and
time_numeric($_) >= time_numeric($time_min))
{
print "$_ is between $time_min and $time_max\n";
}
else
{
print "$_ ain't between $time_min and $time_max\n";
}
}
sub time_numeric
{
if ($_[0] =~ /^(\d{1,2}):(\d{1,2}):(\d{1,2})$/)
{
return ($3 + $2 * 100 + $1 * 10000);
}
else
{
die "Invalid time!";
}
}
无需验证时间,只需假设输入是实时的。它也适用于24小时时间戳。
无论字段中是否有前导零,都可以使用输入。
如果您使用的是Perl,请考虑使用Time::Piece
,as demonstrated in this answer等模块。