将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]);

}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...