2016-02-17 3 views
1
[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} \]) из последнего запуска соответствующего имени задания.Regex - отметка времени возврата из последнего запуска задания (CSV-файл)

Использование VB.NET:

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

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

Мой текущий шаблон возвращает первый матч вместо последнего, но даже если я получить правильное выражение, это чувствует себя ужасно громоздким, а также как неправильный подход.

Итак, как я могу заставить это дать мне последний пробег jobname, а также, как я могу сделать это более эффективно?

EDIT: Я ищу метки времени для второго (он же последнего) пробега jobnameA

+0

Это все на одной линии? Если вам просто нужно время ** '\ [(. *)]' **, которое должно получить его между '[]' ... – Codexer

+0

По какой-то причине Regex101.com имеет проблемы с сохранением, я, наконец, получил связь. См. ** https: //regex101.com/r/kP9dQ8/1**. Реализация там ... Также в вашем примере шаблона вам нужно вложить все это в группу захвата, а ваша нет. Конечно, он найдет совпадение, но групп захвата нет ... Так что это будет '(\ [. {19} \] (? =. +? Статус JOB: имя задания))' ... – Codexer

+0

Спасибо за ваш ответы! В вашем примере у вас есть 4 строки, а временная метка соответствует всем 4 строкам. Я ищу, чтобы получить только последний. –

ответ

0

Фигурного это ... не уверен, что это лучший способ, но он получил меня там. Вы можете поместить любой статус или имя задания.

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

или еще лучше использовать переменные

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

Объяснение:

\ п - соответствует перевода строки (строки) символов
[(. *)] - дает нам временную метку (группа захвата 1)
. * - не соответствует любому символу, любое количество раз до тех пор, статус указанного задания
статус. - это статус работы (может быть что угодно, передаваемая переменной)
* - любой символ, любое количество раз (пространство в данном случае)
JobName - указывается задание (передается через переменную)
(* \ 2?!.) - это отрицательный предпросмотр, который использует второй захват группы (статус/JobName), чтобы убедиться, что он возвращает только последний ввод указанного задания в данный статус

Смежные вопросы