Reg Ex匹配时间范围

时间:2013-02-11 12:33:28

标签: regex expression

我有一个日志文件,可以按时间戳保存日志。我要做的是在时间范围之间读取某些值。例如,从文件的开头和5:3:55。我不擅长正则表达式,我想知道如何编写表达式来阅读它。到目前为止,我已经得到了以下表达,这是不对的。任何样品如何正确写入?谢谢

([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)

具有范围解决方案的帖子无法满足我的需求,因为它需要一段时间并处理文件。虽然我需要从文件时间戳的开始到某些增量而不是某些单词匹配。谢谢

2 个答案:

答案 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::Pieceas demonstrated in this answer等模块。