从动态多行字符串中提取多个值

时间:2014-02-02 12:40:37

标签: javascript regex node.js stream visual-sourcesafe-2005

我正在开发一个小型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}
    • {file}已添加
    • {folder}已创建
    • {文件或文件夹}已删除
    • {文件或文件夹}已销毁
    • 标签:{label}
  • 第五个输入行是可选注释块,以Comment:开头。它可能包含任何类型的字符串输入,包括新行,文件名,括号等。基本上,VSS根本不限制注释内容。

我发现正则表达式模式匹配除了“评论:”部分之外的一切,不知道评论中可能包含多少个新行字符,这对像我这样的人来说真的很难根本不会说正则表达式..

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

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

最后,我正在寻找一个对象数组,每个日志更新都有以下条目结构:

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

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

我的应用的当前状态可以在this Github repo中看到。有人可以请帮助我指出正确的方向吗??

1 个答案:

答案 0 :(得分:1)

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

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

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

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

为了更加确定,您可以检查路径后面的版本行:

/\n\n(?=\$\/[^\n]*\nVersion: \d+\n)/