我有一个日志文件,通过时间戳保存日志。我必须做的是读取时间范围内的某些值。例如从文件和5:3:55
开始。我不擅长正则表达式,想知道如何写表达式来阅读它。到目前为止,我有下面的表达,这是不对的。任何样品如何正确书写?由于Reg Ex的匹配时间范围
([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)
有适合我的需要的范围不工作的解决方案,它正在采取一系列的时间和处理文件的帖子。虽然我需要从文件时间戳开始比某些单词匹配比确定的增量。谢谢
我有一个日志文件,通过时间戳保存日志。我必须做的是读取时间范围内的某些值。例如从文件和5:3:55
开始。我不擅长正则表达式,想知道如何写表达式来阅读它。到目前为止,我有下面的表达,这是不对的。任何样品如何正确书写?由于Reg Ex的匹配时间范围
([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)
有适合我的需要的范围不工作的解决方案,它正在采取一系列的时间和处理文件的帖子。虽然我需要从文件时间戳开始比某些单词匹配比确定的增量。谢谢
您需要比正则表达式多一点(至少能够形成一个理智的解决方案)。下面是一个说明在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。
不要使用数学正则表达式!您可以使用它们来解析所有日期(例如,使用您在问题中包含的正则表达式),然后使用解析的值与您给定的时间戳进行比较。这就像词汇比较数字。
如果你真的需要一个5之间的每一个日期相匹配的正则表达式:3:34和5:3:55,那就需要单独匹配所有可能的数字:
/5:3:(3[4-9]|4[0-9]|5[0-5])/
不符合'5:3:50'? – 2013-02-11 12:57:45
哎呀,感谢@NaveedS修复它。 – Bergi 2013-02-11 14:14:25
不,正则表达式只是这个错误的工具。尝试解决它没有他们。顺便说一句,你从哪里得到这个正则表达式,这似乎与你的问题没有关系? – Bergi 2013-02-11 12:37:52
是几秒钟? – nozzleman 2013-02-11 12:38:05
这个正则表达式匹配'0:0:0','00:00:00','23:59:59'等。你的要求是什么? – 2013-02-11 12:38:55