【问题标题】:Advice Regex, check timestamp建议正则表达式,检查时间戳
【发布时间】:2017-04-11 13:34:44
【问题描述】:

我对 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 秒的间隔内。

所以,我的问题是: 足以解决这个问题吗?或者我会实现更多代码(例如比较时间戳)

谢谢大家!但我有一个 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).*)*

它提取所有文本,但不提取时间戳。有什么解决办法吗?

【问题讨论】:

  • 您可以使用Regex 提取时间戳...但是您必须比较它们,可能会将它们转换为Timespan
  • @xanatos 谢谢,我怀疑。也许我相信实现更多的代码。
  • @xanatos,嗨,对我的编辑有什么建议吗?

标签: regex regex c# regex msdn dngrep


【解决方案1】:

这个:

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 是描述的第一行。如果您想“保存”描述的所有行,它会变得更复杂一些。从这里比较两个连续项目的DateTime(在for 循环内)很容易。

提取 XYZ (Item2) 和数字 (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();

【讨论】:

    【解决方案2】:

    试试下面不使用正则表达式的代码

    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;
                            }
    
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多