Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将string/stringbuilder解析到类中,我应该如何进行?_C#_String_Parsing_Class_.net 3.5 - Fatal编程技术网

C# 将string/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中,我想将其解析到我的类列表中:

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组的信息文本
通过测试第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]);

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

}