如何解决将string / stringbuilder解析为类,该如何处理?
| 我必须解析的所有数据当前都存储在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总是带有<>
当没有“ 4”或“ 5”时,它是一条信息类型的消息。
消息是其余示例:
has left this room
accessed file X
has openned blocked website
现在,我仍然在这里思考使用什么。
我可以使用正则表达式提取每个字符串,如下所示:
Regex getData = new Regex(@\"^\\[(\\d{1,2}:\\d{1,2})\\] \\[([A-Za-z]+)\\] \");
但是从根本上说,我将需要对每条消息进行几项检查,因此我对此不太满意。
例如,考虑使用split:
string line = item.Replace(\"[\",\"\").Replace(\"]\",\"\");
string[] fields = line.Split(\' \');
然后我将检查拆分的案例将很容易检测到MessageType,但我认为不是那么可靠。
我想要一些建议和想法,以解决这个问题?
也许我只是使逻辑过于复杂了:/
解决方法
正则表达式可能在这里最方便。试试这个:
^\\[(\\d{2}:\\d{2}:\\d{2})\\]\\s*(\\[(System|Warn)[\\w\\s]*\\])?\\s*<([^>]*)>\\s*(.*)$
翻译:
从行的开头开始,将[##:##:##]匹配到捕获组1
然后(可选)将系统/警告说明符匹配到捕获组2和3中(2将所有文本放在方括号中,仅3将System / Warn关键字保留在括号中)
然后在尖括号中捕获用户名,进入捕获组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]);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。