0
Regex messageServerRegex = 
    new Regex(@"([0-9\-]{10})\ ([0-9:]{8})\ \[TEXT\]\ (\[Server\])\ ([^\[]*)");

if (messageServerRegex.IsMatch(rchConsoleText))
{
    var infoMatches = messageServerRegex.Split(rchConsoleText);
    Console.WriteLine("Date: {0}\nTime: {1}\nType: {2}\nMessage: {3}",
    infoMatches[1], infoMatches[2], infoMatches[3], infoMatches[4]);
}

这是我们希望服务器过滤的文本的两个示例

2012-12-24 02:24:18 [TEXT] [Server] 2012-12-24 02:24:18 [TEXT] [Server] 示例文本。

我们希望从这一行得到的结果是:

日期:2012-12-14  
时间:02:24:18  
类型:[文本] [服务器]  
消息:2012-12-24 02:24:18 [TEXT] [Server] 示例文本。  

但它会回复:

日期:2012-12-14  
时间:02:24:18  
类型:[文本] [服务器]  
留言:2012-12-24 02:24:18  

如您所见,它只显示日期和时间,那是因为正则表达式过滤了它,所以我如何让它只削减日期和时间 1 次?

第二个示例运行良好,即:

2012-12-24 02:24:18 [TEXT] [Server] 示例文本示例文本示例文本。

我们希望从这一行得到的结果是:

日期:2012-12-14  
时间:02:24:18  
类型:[文本] [服务器]  
消息:示例文本示例文本示例文本。  
4

3 回答 3

2

我不知道您的输入是否被分成几行。如果是这样,使用 Match 很容易。

     var inputs = new string[]{
        @"2012-12-24 02:24:18 [TEXT] [Server] 2012-12-24 02:24:18 [TEXT] [Server] Sample text.",
        @"2012-12-24 02:24:18 [TEXT] [Server] Sample text sample text sample text."};

     foreach(string input in inputs)
     {
        string pattern = @"([0-9\-]{10}) ([0-9:]{8}) \[TEXT\]\ (\[Server\]) (.*)";
        var match = Regex.Match(input, pattern);
        Console.WriteLine(
           "Date: {0}\nTime: {1}\nType: {2}\nMessage: {3}",
           match.Groups[1].Value, match.Groups[2].Value, match.Groups[3].Value, match.Groups[4].Value);
     }

如果没有,它会变得更难 - 而不是 a.*它将是((?!something that indicates the next entry).)

于 2012-12-24T02:46:28.000 回答
0

正则表达式中的最后一组不包括 '[' 字符,如果它包含 [ 字符,则会导致该行的文本部分不匹配。如果输入表示单个日志消息,则排除似乎是不必要的。尝试不排除,.*,看看是否有效

于 2012-12-24T02:32:59.560 回答
0

怎么样:

^([0-9\-]{10})\ ([0-9:]{8})\s*\[TEXT\]\s*\[Server\]\s*(.*)
于 2012-12-24T02:47:40.743 回答