【问题标题】:Matching everything between two specific words using regular expressions使用正则表达式匹配两个特定单词之间的所有内容
【发布时间】:2010-08-27 15:48:09
【问题描述】:

我正在尝试使用正则表达式解析 Oracle 跟踪文件。我选择的语言是 C#,但我选择在这个练习中使用 Ruby 来熟悉它。

日志文件有些可预测。大多数行(具体为 99.8%)匹配以下模式:

# [Timestamp]                  [Thread]  [Event]   [Message]
# TIME:2010/08/25-12:00:01:945 TID: a2c  (VERSION) Managed Assembly version: 2.102.2.20
# TIME:2010/08/25-14:00:02:398 TID:1a60  OpsSqlPrepare2(): SELECT * FROM MyTable
line_regex = /^TIME:(\S+)\s+TID:\s*(\S+)\s+(\S+)\s+(.*)$/

然而,在日志中的一些地方有很多复杂的查询,由于某种原因,跨越了几行:

关于这些条目需要指出的两点是,它们似乎会导致日志文件中的某种损坏,因为它们以不可打印的字符结尾,然后突然下一个条目在同一行开始。

由于这显然排除了逐行捕获数据,我认为下一个最佳选择是匹配单词“TIME:”与“TIME:”的下一个实例或文件末尾之间的所有内容.我不确定如何使用正则表达式来表达这一点。

有没有更有效的方法?我需要解析的日志文件将超过 1.5GB。我的目的是规范化这些行,并删除不必要的行,最终将它们作为行插入数据库中以进行查询。

谢谢!

【问题讨论】:

    标签: c# ruby regex text-parsing logfiles


    【解决方案1】:

    匹配“TIME:”和“TIME:”字符串之间或文件结尾之间的潜在多行数据的正则表达式是:

    /^TIME:(.+?)(?=TIME:|\z)/im
    

    另一方面,正如 James 所提到的,对“TIME:”子字符串进行标记,或查找“\r\nTIME:”的子字符串位置(在第一个“TIME:”条目之后,取决于换行符格式)可能证明更好的方法。

    【讨论】:

      【解决方案2】:

      这样做可能会更好,即一次读取一行文件...从第一个“TIME”开始,然后连接您的行,直到您点击下一个“TIME”...您可以使用正则表达式来过滤掉您不想要的任何行。

      我不能和 Ruby 说话;在 C# 中,它当然是 StreamReader,它可以帮助您处理文件大小。

      【讨论】:

        猜你喜欢
        • 2018-12-21
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 2013-10-31
        • 2010-09-22
        • 2019-11-12
        • 1970-01-01
        相关资源
        最近更新 更多