代码之家  ›  专栏  ›  技术社区  ›  Justin Rusbatch

使用正则表达式匹配两个特定单词之间的所有内容

  •  2
  • Justin Rusbatch  · 技术社区  · 14 年前

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

    # [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+(.*)$/
    

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

    Screenshot

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

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  1
  •   James King    14 年前

    最好还是按老规矩做,一次只读一行。。。从第一个“时间”开始,连接行,直到到达下一个“时间”。。。可以使用正则表达式过滤掉任何不需要的行。

    我不能和鲁比说话,在C语言里,那会是一个错误 StreamReader ,当然,这有助于处理文件大小。

        2
  •  2
  •   Rudu Andrew Whitaker    14 年前

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

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