2017-04-11 52 views
0

我對Microsoft的(正則表達式)有疑問。我有一個日誌文件寫在這種模式下。建議正則表達式,檢查時間戳

2017-02-20 15:58:45.442 - [XYZ] 155 RADIO_TRAIN_TO_TRACK_INITIATION_COM_SESSION 
             .VAR1A: 155 
             .VAR2B 
             .VAR3z 
             .VAR4t 
    2017-02-20 15:58:46.432 - [XYZ] 32 RADIO_TRACK_TO_TRAIN_CONFIGURATION_DETERMINATION 
             .VAR1A: 32 
             .VAR2Y 
             .VAR3s 
             .VAR4a 
             .VAR5w 
             .VAR6d 
    2017-02-20 15:58:48.541 - [XYZ] 156 RADIO_TRAIN_TO_TRACK_INITIATION_COM_SESSION 
             .VAR1A: 156 
             .NIDPACKET 
             .VAR3l 
             .VAR56 
             .VAR7b 
             .VAR100k 

問題:我將有一個表達式,以檢查是否第一消息[XYZ] 155和第二消息[XYZ] 32是連續的並且它們在10秒的間隔內。

所以,我的問題是:足以解決這個問題?或者我會實現更多的代碼(例如比較TimeStamp)

謝謝大家!但我有一個應用程序在C#中,我會嘗試添加您的代碼來修改它。

我的想法是:

1)提取所有文本以MEX [XYZ] 155和所有文本MEX [XYZ]包括156(時間戳)

2)檢查所述時間戳是時間間隔內10秒。如果正確返回OK,否則返回空的解決方案。

關於第一點,我試試這個正則表達式

(?<=\[XYZ] \b155\b(?:(?!\n\d{4}-\d{2}-\d).)*?\n {3,}\.).*(?:\r?\n(?!\d{4}-\d{2}-\d).*)*|(?<=\[XYZ] \b156\b(?:(?!\n\d{4}-\d{2}-\d).)*?\n {3,}\.).*(?:\r?\n(?!\d{4}-\d{2}-\d).*)* 

它提取的所有文本,而不是時間戳。任何解決它的建議?

+0

你可以用'Regex'提取時間戳...但是然後你必須將它們進行比較,可能將它們轉換爲'Timespan' – xanatos

+0

@xanatos謝謝,我懷疑它。也許我相信要實現更多的代碼。 – nonac

+0

@xanatos,嗨,關於我的編輯的任何建議? – nonac

回答

0

此:

var rx = new Regex(@"^ *([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}) - (.*)", RegexOptions.Multiline); 
var matches = rx.Matches(str).Cast<Match>().Select(x => Tuple.Create(DateTime.Parse(x.Groups[1].Value, CultureInfo.InvariantCulture), x.Groups[2].Value)).ToArray(); 

應返回的元組的陣列)中,用Item1日誌的DateTimeItem2描述的第一行。如果你想「保存」描述的所有行,它會變得更復雜一些。從這裏比較連續兩個項目(在for週期內)的DateTime很容易。

變來提取XYZItem2)和數量(Item3):

var rx = new Regex(@"^ *([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}) - \[([^]]*)\] *([0-9]*)", RegexOptions.Multiline); 
var matches = rx.Matches(str).Cast<Match>().Select(x => Tuple.Create(DateTime.Parse(x.Groups[1].Value, CultureInfo.InvariantCulture), x.Groups[2].Value, x.Groups[3].Value, x.Groups[4].Value)).ToArray(); 
+0

我編輯我的問題 – nonac

0

try代碼象下面這樣不使用正則表達式

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication49 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.txt"; 
     static void Main(string[] args) 
     { 
      //DateTime endTime = DateTime.Now; 
      DateTime endTime = DateTime.Parse("2017-02-20 15:58:50"); 
      DateTime startTime = endTime.AddSeconds(-10); 

      Session session = new Session(startTime, endTime); 
      session.ReadFile(FILENAME); 

     } 

    } 
    public class Session 
    { 
     public static List<Session> sessions = new List<Session>(); 

     public static DateTime startTime { get; set; } 
     public static DateTime endTime { get; set; } 

     public DateTime time { get; set; } 
     public string name { get; set; } 
     public List<string> properties { get; set; } 

     public Session() 
     { 
     } 

     public Session(DateTime startTime, DateTime endTime) 
     { 
      Session.startTime = startTime; 
      Session.endTime = endTime; 
     } 
     public void ReadFile(string filename) 
     { 
      StreamReader reader = new StreamReader(filename); 

      string inputLine = ""; 
      Session newSession = null; 
      Boolean skip = false; 
      while ((inputLine = reader.ReadLine()) != null) 
      { 
       inputLine = inputLine.Trim(); 
       if (inputLine.Length > 0) 
       { 
        if (inputLine.StartsWith(".") && (skip == false)) 
        { 
         newSession.properties.Add(inputLine); 
        } 
        if(!inputLine.StartsWith(".")) 
        { 
         string[] array = inputLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
         DateTime time = DateTime.Parse(array[0] + ' ' + array[1]); 
         if ((time > startTime) && (time < endTime)) 
         { 
          skip = false; 
          newSession = new Session(); 
          newSession.properties = new List<string>(); 
          Session.sessions.Add(newSession); 

          newSession.time = time; 
          newSession.name = array[5]; 
         } 
         else 
         { 
          skip = true; 
         } 

        } 
       } 
      } 
     } 
    } 
} 
+0

我編輯我的問題 – nonac

+0

我更新了代碼以添加DateTime過濾器。 – jdweng