C# 将string/stringbuilder解析到类中,我应该如何进行?
我必须解析的所有数据当前都存储在StringBuilder中,我想将其解析到我的类列表中:C# 将string/stringbuilder解析到类中,我应该如何进行?,c#,string,parsing,class,.net-3.5,C#,String,Parsing,Class,.net 3.5,我必须解析的所有数据当前都存储在StringBuilder中,我想将其解析到我的类列表中: StringBuilder data = new StringBuilder(length); 因此,我将我的班级分配到一个列表: public class Messages { public DateTime Sent { get; set; } public string User {get; set; } public MessageType TypeUsed { get;
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>();
现在我还在想该用什么
我可以使用正则表达式提取每个字符串,如下所示:
Regex getData = new Regex(@"^\[(\d{1,2}:\d{1,2}:\d{1,2})\] \[([A-Za-z]+)\] ");
但是,我基本上需要对每条消息进行几次检查,这样我就不太适应了
t思考如何使用拆分,例如:
string line = item.Replace("[", "").Replace("]", "");
string[] fields = line.Split(' ');
然后我会检查拆分的案例,很容易检测到消息类型,但我认为不太可靠
我想了解一些建议和想法,以了解如何进行此项工作?
也许我只是把逻辑复杂化了:/正则表达式在这里可能是最方便的。试试这个:
^\[(\d{2}:\d{2}:\d{2})\]\s*(\[(System|Warn)[\w\s]*\])?\s*<([^>]*)>\s*(.*)$
^\[(\d{2}:\d{2}:\d{2})\]\s*(\[(系统警告)[\w\s]*\])?\s*]*)>\s*(*)$
翻译:
- 从行首开始,将[###:###:##]匹配到捕获组1中
- 然后可选地将系统/警告说明符匹配到捕获组2和3中(2包含括号中的所有文本,3仅包含系统/警告关键字)
- 然后将尖括号内的用户名捕获到捕获组4中
- 最后是第5组的信息文本
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]);
}
var regex=new regex(@“^\[(\d{2}:\d{2}:\d{2})\]\s*(\[(系统警告)[\w\s]*\])?\s*]>\s*(.*)”;
var输入=新[]
{
“[13:49:13][System Message]已打开被阻止的网站”,
“[13:49:14]已访问文件X”,
“[13:52:46][系统消息]已进入此房间”,
“[13:52:49][系统消息]已离开此房间”
};
foreach(输入中的var行){
var match=regex.match(行);
如果(!match.Success){
抛出新ArgumentException();
}
Console.WriteLine(“新消息:”);
控制台.WriteLine(“时间:+match.Groups[1]);
Console.WriteLine(“类型:“+match.Groups[2]);
Console.WriteLine(“用户:+match.Groups[4]);
Console.WriteLine(“文本:+match.Groups[5]);
}
+1非常详细,听起来很酷。我最初考虑使用正则表达式,但后来遇到了一些情况,当它没有[System*]信息时,我会检查您的示例。谢谢。@Prix:为了方便起见,我添加了一些示例代码,请检查。
^\[(\d{2}:\d{2}:\d{2})\]\s*(\[(System|Warn)[\w\s]*\])?\s*<([^>]*)>\s*(.*)$
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]);
}