【问题标题】:Only find the first match in a regex search仅在正则表达式搜索中找到第一个匹配项
【发布时间】:2012-12-24 02:12:40
【问题描述】:
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 类型:[文本] [服务器] 消息:示例文本示例文本示例文本。

【问题讨论】:

  • 您使用Split有什么原因吗?我认为这使它变得比它需要的更复杂。为什么不将regex.Match.Matches 与命名组一起使用?
  • @agent-j 这不是在同一个输出中解析吗?

标签: c# regex


【解决方案1】:

我不知道您的输入是否被分成几行。如果是这样,使用 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);
     }

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

【讨论】:

  • 这让我走上了正确的道路,它几乎可以按照我想要的方式工作,谢谢!
【解决方案2】:

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

【讨论】:

  • 然后我得到这个输出:"Message: 2" :(.
  • 没有注意到你在使用拆分。尝试 agent-js 建议并使用 .match 并使用正则表达式中的捕获组
【解决方案3】:

怎么样:

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

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 2013-05-18
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多