正则表达式 - 从上次作业运行返回时间戳(CSV文件)

时间:2016-02-17 20:47:52

标签: regex vb.net csv

[00/00/0000 00:00:00]     EVENT: event    STATUS: success      JOB: jobnameA     MACHINE: machine
[00/00/0000 00:00:00]     EVENT: event    STATUS: failed       JOB: jobnameB     MACHINE: machine
[11/11/1111 11:11:11]     EVENT: event    STATUS: success      JOB: jobnameA     MACHINE: machine
[12/12/1212 12:12:12]     EVENT: event    STATUS: success      JOB: jobnameB     MACHINE: machine
[22/22/2222 22:22:22]     EVENT: event    STATUS: hold         JOB: jobnameC     MACHINE: machine

这是来自.csv日志文件的两个示例行,显示了不同的作业运行。我正在尝试使用正则表达式从匹配作业名的最后一次运行中返回时间戳(\ [。{19} \])。

使用VB.NET:

Dim pattern As String = "\[.{19}\](?=.+?status         JOB: jobname)"

reader = New StreamReader(path)
fileContents = reader.ReadToEnd()
m = Regex.Match(fileContents, pattern)

我当前的模式返回的是第一个匹配而不是最后一个匹配,但即使我确实得到了正确的表达式,这也感觉非常麻烦,也喜欢错误的方法。

首先,我怎样才能让这个给我最后一次的工作名称,而且,我怎样才能更有效地做到这一点?

编辑:我正在寻找jobnameA的第二次(也就是最后一次)运行的时间戳

1 个答案:

答案 0 :(得分:0)

想出来......不确定这是不是最好的方式,但它让我在那里。您可以输入任何状态或工作名称。

pattern = "\n\[(.*)].*(success.*jobnameA)(?!.*\2)"

或更好地使用变量

pattern = "\n\[(.*)].*(" & status & ".*" & jobname & ")(?!.*\2)"

说明:

\ n - 匹配换行符(换行符)字符
[(。*)] - 为我们提供时间戳(捕获组1)
。* - 在任何时间内匹配任何字符,直到指定的作业状态为止 状态 - 是作业状态(可以通过变量传递任何内容)
。* - 任意数量的任何字符(本例中为空格)
作业名 - 指定作业(通过变量传递)
(?!。* \ 2) - 是使用第二个捕获组的负前瞻 (status / jobname)确保它仅返回给定状态中所述作业的最后一个条目