0

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

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

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

4

2 回答 2

2

不要在数学中使用正则表达式!您可以使用它们来解析所有日期(例如,使用您在问题中包含的正则表达式),然后使用解析值与您的给定时间戳进行比较。这就像在词汇上比较数字。

如果你真的需要一个匹配5:3:345:3:55之间每个日期的正则表达式,它需要分别匹配所有可能的数字:

/5:3:(3[4-9]|4[0-9]|5[0-5])/
于 2013-02-11T12:42:40.707 回答
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如本答案所示

于 2013-02-11T13:20:55.783 回答