我正在开发一个小型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.
到目前为止,已知以下几点:
User:
,Date:
和Time:
。Comment:
开头。它可能包含任何类型的字符串输入,包括新行,文件名,括号等。基本上,VSS根本不限制注释内容。我发现正则表达式模式匹配除了“评论:”部分之外的一切,不知道评论中可能包含多少个新行字符,这对像我这样的人来说真的很难根本不会说正则表达式..
到目前为止,我已经设法让我的应用程序查看日志文件以进行更改,并仅捕获流中的新数据。我最初的计划是在流输出上使用.split('\n\n')
来捕获每个单独的条目,但由于注释在任何位置也可能包含任意数量的新行,这不是一个安全的方法。
我找到了一个名为regex-stream的模块,这让我觉得在提取细节之前我不需要在字符串数组中收集结果,但我并不真正理解给定的用法示例。或者,我对分割和解析单个字符串没有任何问题,只要我能找到一种可靠的方法将流分解为单个条目。
最后,我正在寻找一个对象数组,每个日志更新都有以下条目结构:
{
path: "",
version: "",
user: "",
date: "",
time: "",
action: "",
comment: ""
}
请注意:如果在一个操作中签入了100个文件,VSS仍会记录每个文件的条目。为了防止通知垃圾邮件,我仍然需要在生成任何通知之前执行其他验证和分组。
我的应用的当前状态可以在this Github repo中看到。有人可以请帮助我指出正确的方向吗??
答案 0 :(得分:1)
当Comment部分可以包含任何内容时,没有100%的万无一失的解析方法。下一个最好的选择是做一些启发式,并希望没有疯狂的评论。
如果我们可以假设2个新行跟随路径表示条目的开始,那么我们可以拆分此正则表达式(在将所有行分隔符的变体替换为\n
之后):
/\n\n(?=\$\/[^\n]*\n)/
前瞻(?=pattern)
会检查前面有一条路径\$\/[^\n]*\n
,而不会消耗它。
为了更加确定,您可以检查路径后面的版本行:
/\n\n(?=\$\/[^\n]*\nVersion: \d+\n)/