C# 仅在正则表达式搜索中查找第一个匹配项

C# 仅在正则表达式搜索中查找第一个匹配项,c#,regex,C#,Regex,下面是我们希望服务器筛选的文本的两个示例 2012-12-24 02:24:18[文本][服务器]2012-12-24 02:24:18[文本][服务器]示例文本 我们希望从这一行返回的结果是: Regex messageServerRegex = new Regex(@"([0-9\-]{10})\ ([0-9:]{8})\ \[TEXT\]\ (\[Server\])\ ([^\[]*)"); if (messageServerRegex.IsMatch(rchConsoleTe

下面是我们希望服务器筛选的文本的两个示例

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

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

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]);
}
Date: 2012-12-14 Time: 02:24:18 Type: [TEXT] [Server] Message: 2012-12-24 02:24:18 日期:2012-12-14 时间:02:24:18 类型:[文本][服务器] 消息:2012-12-2402:24:18[文本][服务器]示例文本。 但它的回应是:

Date: 2012-12-14 Time: 02:24:18 Type: [TEXT] [Server] Message: 2012-12-24 02:24:18 [TEXT] [Server] Sample text. 日期:2012-12-14 时间:02:24:18 类型:[文本][服务器] 留言:2012-12-2402:24:18 正如你所看到的,它只显示日期和时间,这是因为正则表达式过滤了日期和时间,那么我如何让它只将日期和时间减少1次呢

第二个示例很好,即:

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

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

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]);
}
Date: 2012-12-14 Time: 02:24:18 Type: [TEXT] [Server] Message: 2012-12-24 02:24:18 日期:2012-12-14 时间:02:24:18 类型:[文本][服务器] 消息:示例文本示例文本示例文本。
正则表达式中的最后一个组不包括“[”字符,如果该行包含[字符。如果输入表示单个日志消息,则排除似乎是不必要的。请在不排除的情况下尝试它,.*,然后查看是否有效

我无法判断您的输入是否分为几行。如果是这样,很容易使用Match

Date: 2012-12-14 Time: 02:24:18 Type: [TEXT] [Server] Message: Sample text sample text sample text. 如果不是,它会变得更难-它将是一个
(?!指示下一个条目的东西)而不是
*
如何:

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

您使用Split有什么原因吗?我认为这使它变得比需要的更复杂。为什么不使用
regex.Match
.Matches
与命名组一起使用?@agent-j不在同一输出中解析吗?然后我得到以下输出:“消息:2”:(.没有注意到您正在使用split。请尝试代理js建议并使用。匹配并使用您的RegExt中的捕获组。这使我走上了正确的道路,它几乎按照我的要求工作,谢谢!