0

我正在开发一个小型 Node.js 应用程序来解析正在运行的日志文件,以便提取键值并根据结果生成自定义警报。但是,我现在遇到了一个我似乎无法找到解决方案的问题。如果它完全相关,则正在解析的特定日志是 MS SourceSafe 2005 日志文件。

为清楚起见,以下是三个可能的日记帐分录示例(出于隐私原因更改了一些细节,结构保持不变):

$/path/to/a/project/folder
Version: 84
User: User1           Date: 14/01/27  Time: 12:15p
testBanner.rb added
Comment: Style and content changes based on corporate branding
Remove detector column on sc600 page
Styling tweaks and bug fixes

$/path/to/a/project/file.java
Version: 22
User: User2           Date: 14/01/29  Time: 12:34p
Checked in
Comment: Added fw updates to help fix (xxx) as seen in (yyy):
Changes include:
1) Peak tuning (minimum peak distance, and percentage crosstalk peak)
2) Dynamic pulses adjusted in run time by the sensor for low temperature climate
s
3) Startup noise automatic resets
4) More faults

$/path/to/a/project/folder
Version: 29
User: User3           Date: 14/01/30  Time: 11:54a
Labeled v2.036
Comment: Added many changes at this point, see aaVersion.java for a more comple
te listing.

到目前为止,已知以下几点:

  • 第一个输入行始终是相关的 VSS 数据库项目或文件路径。
  • 第二个输入行始终是上述项目或文件的相关版本。
  • 第三个输入行始终包含三个值User:Date:Time:
  • 第四个输入行始终是关联的操作,可以是以下任何一项:
    • 签入:{file}
    • 已添加 {文件}
    • {文件夹}已创建
    • {文件或文件夹}已删除
    • {文件或文件夹}已销毁
    • 标记:{标签}
  • 第五行是一个可选的注释块,以 . 开头Comment:。它可以包含任何类型的字符串输入,包括换行符、文件名、括号等。基本上 VSS 根本不限制注释内容。

我发现正则表达式模式可以匹配“评论:”部分之外的所有内容,不知道评论中可能包含多少个换行符,这对于像我这样完全不会说非常流利的正则表达式的人来说真的很困难..

到目前为止,我已经设法让我的应用程序查看日志文件的更改并仅捕获流中的新数据。我最初的计划是.split('\n\n')在流输出上使用来捕获每个单独的条目,但由于注释也可能在任何位置包含任意数量的新行,这并不是一种安全的方法。

我发现了一个名为regex-stream的模块,这让我觉得我不需要在提取详细信息之前将结果收集到字符串数组中,但我并不真正理解给定的使用示例。或者,我对拆分和解析单个字符串没有问题,只要我能找到一种可靠的方法将流分解为单个条目。

最后,我正在为日志的每次更新寻找具有以下条目结构的对象数组:

{
    path: "",
    version: "",
    user: "",
    date: "",
    time: "",
    action: "",
    comment: ""
}

请注意:如果在一个操作中签入了 100 个文件,VSS 仍会为每个文件记录一个条目。为了防止通知垃圾邮件,我仍然需要在生成任何通知之前执行额外的验证和分组。

我的应用程序的当前状态可以在这个 Github repo中看到。有人可以帮我指出正确的方向吗...?

4

1 回答 1

0

当 Comment 部分可以包含任何内容时,没有 100% 万无一失的解析方法。下一个最佳选择是进行一些启发式方法,并希望没有疯狂的评论。

如果我们可以假设后跟路径的 2 个新行表示条目的开始,那么我们可以在这个正则表达式上进行拆分(在将行分隔符的所有变体替换为 之后\n):

/\n\n(?=\$\/[^\n]*\n)/

前瞻(?=pattern)检查是否有前面的路径\$\/[^\n]*\n,而不消耗它。

为了更加确定,您可以检查版本行是否跟随在路径之后:

/\n\n(?=\$\/[^\n]*\nVersion: \d+\n)/
于 2014-02-02T16:14:43.703 回答