将string/stringbuilder解析为类,我应该如何处理它

本文关键字:何处理 处理 我应该 stringbuilder string | 更新日期: 2023-09-27 17:57:51

我要解析的所有数据当前都存储在StringBuilder中,我想将其解析到我的类列表中:

StringBuilder data = new StringBuilder(length);

所以我把我的班级分配到一个列表中:

public class Messages
{
    public DateTime Sent { get; set; }
    public string User {get; set; }
    public MessageType TypeUsed { get; set; }
    public string Message { get; set; }
}
public enum MessageType
{
    System,
    Info,
    Warn
}
public List<Messages> myList = new List<Messages>();

下面是一些我需要解析的消息示例:

[13:49:13] [System Message] <Username>  has openned blocked website 
[13:49:14] <Username> accessed file X
[13:52:46] [System Message] <Username>  has entered this room 
[13:52:49] [System Message] <Username>  has left this room 

我怀疑什么是解析它的最佳方式

时间存在于所有消息中。Usernaem始终与<>在一起当没有[System Message][Warn Message]时,它是一个Info类型的消息。消息是剩下的例子:

has left this room
accessed file X
has openned blocked website

现在我还在想该用什么。

我可以使用正则表达式提取每个字符串,如下所示:

Regex getData = new Regex(@"^'[('d{1,2}:'d{1,2}:'d{1,2})'] '[([A-Za-z]+)'] ");

但我基本上需要对每条消息进行几次检查,所以我对它不太满意

关于使用拆分的棘手问题,例如:

string line = item.Replace("[", "").Replace("]", "");
string[] fields = line.Split(' ');

然后我会检查拆分的情况是否很容易检测到MessageType,但我认为不那么可靠。

我想听听我该怎么做

也许我只是过于复杂化了逻辑:/

将string/stringbuilder解析为类,我应该如何处理它

正则表达式在这里可能是最方便的。试试这个:

^'[('d{2}:'d{2}:'d{2})']'s*('[(System|Warn)['w's]*'])?'s*<([^>]*)>'s*(.*)$

翻译:

  • 从行首开始,将[##:##:###]匹配到捕获组1
  • 然后可选地将System/Warn说明符匹配到捕获组2和3中(2将所有文本放在括号中,3仅包含System/Warne关键字)
  • 然后将尖括号内的用户名捕获到捕获组4中
  • 最后是第5组中的消息文本

通过测试每行第2或第3组的内容,您就知道它是什么类型的消息。所有其他字段都可以直接从捕获组中使用。

更新:

以下是上面的示例代码:

var regex = new Regex(@"^'[('d{2}:'d{2}:'d{2})']'s*('[(System|Warn)['w's]*'])?'s*<([^>]*)>'s*(.*)$");
var input = new[]
    {
        "[13:49:13] [System Message] <Username>  has openned blocked website", 
        "[13:49:14] <Username> accessed file X",
        "[13:52:46] [System Message] <Username>  has entered this room",
        "[13:52:49] [System Message] <Username>  has left this room"
    };
foreach (var line in input) {
    var match = regex.Match(line);
    if (!match.Success) {
        throw new ArgumentException();
    }
    Console.WriteLine("NEW MESSAGE:");
    Console.WriteLine("     Time: " + match.Groups[1]);
    Console.WriteLine("     Type: " + match.Groups[2]);
    Console.WriteLine("     User: " + match.Groups[4]);
    Console.WriteLine("     Text: " + match.Groups[5]);
}