只在正则表达式搜索中找到第一个匹配项

时间:2012-12-24 02:12:41

标签: c# regex

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 [文字] [服务器] 2012-12-24 02:24:18 [文字] [服务器]示例文字。

我们希望从这一行返回的结果是:

Date: 2012-12-14  
Time: 02:24:18  
Type: [TEXT] [Server]  
Message: 2012-12-24 02:24:18 [TEXT] [Server] Sample text.  

但它会回复:

Date: 2012-12-14  
Time: 02:24:18  
Type: [TEXT] [Server]  
Message: 2012-12-24 02:24:18  

正如你所看到的,它只显示了日期和时间,这是因为正则表达式对此进行了过滤,那么如何让它只减少一次日期和时间呢?

第二个例子工作正常,即:

  

2012-12-24 02:24:18 [TEXT] [服务器]示例文本示例文本示例文本。

我们希望从这一行返回的结果是:

Date: 2012-12-14  
Time: 02:24:18  
Type: [TEXT] [Server]  
Message: Sample text sample text sample text.  

3 个答案:

答案 0 :(得分:2)

我无法判断你的输入是否被分成了几行。如果是这样,那就很容易使用匹配。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

怎么样:

^([0-9\-]{10})\ ([0-9:]{8})\s*\[TEXT\]\s*\[Server\]\s*(.*)