2013-02-11 56 views
0

我有一个日志文件,通过时间戳保存日志。我必须做的是读取时间范围内的某些值。例如从文件和5:3:55开始。我不擅长正则表达式,想知道如何写表达式来阅读它。到目前为止,我有下面的表达,这是不对的。任何样品如何正确书写?由于Reg Ex的匹配时间范围

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

有适合我的需要的范围不工作的解决方案,它正在采取一系列的时间和处理文件的帖子。虽然我需要从文件时间戳开始比某些单词匹配比确定的增量。谢谢

+2

不,正则表达式只是这个错误的工具。尝试解决它没有他们。顺便说一句,你从哪里得到这个正则表达式,这似乎与你的问题没有关系? – Bergi 2013-02-11 12:37:52

+0

是几秒钟? – nozzleman 2013-02-11 12:38:05

+1

这个正则表达式匹配'0:0:0','00:00:00','23:59:59'等。你的要求是什么? – 2013-02-11 12:38:55

回答

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

2

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

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

/5:3:(3[4-9]|4[0-9]|5[0-5])/ 
+1

不符合'5:3:50'? – 2013-02-11 12:57:45

+0

哎呀,感谢@NaveedS修复它。 – Bergi 2013-02-11 14:14:25