将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,但我认为不那么可靠。
我想听听我该怎么做
也许我只是过于复杂化了逻辑:/
正则表达式在这里可能是最方便的。试试这个:
^'[('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]);
}