0

タイムスタンプごとにログを保存するログファイルがあります。私がしなければならないのは、時間範囲の間の特定の値を読み取ることです。たとえば、ファイルの先頭から5:3:55。正規表現が苦手なのですが、どうすればそれを読み取るための式を書くことができるのでしょうか。これまでのところ、私は正しくない次の表現を持ってきました。それを正しく書く方法のサンプルはありますか?ありがとう

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

範囲の解決策がある投稿は、範囲の時間がかかり、ファイルを処理しているため、私のニーズには合いません。特定の単語の一致よりも、特定の増分よりもファイルのタイムスタンプの先頭から移動する必要があります。ありがとう

4

2 に答える 2

2

数学に正規表現を使用しないでください。それらを使用してすべての日付を解析することができますが (たとえば、質問に含めた正規表現を使用して)、解析された値を使用して指定されたタイムスタンプと比較します。数字を字句的に比較するようなものです。

5:3:34から5: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 に答える