Разбор - Добавление группы захвата - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь использовать довольно сложное выражение REGEX (см. Демонстрацию REGEX101 ниже), которое я немного изменил по сравнению с тем, которое было создано экспертом на этом сайте. Он анализирует конкретные шаблоны событий журнала:

  • 1 EXE_IN 1 EXE_CO 2 1010 * CONTENT_ACCESS * 3 1012 * CONTENT_ACCESS *

Эти лог-последовательности всегда начинаются со случайного выбора событий EXE_IN или EXE_CO с предшествующими порядковыми номерами. Эти выборы могут быть любым числом, в любом порядке. В этом случае у нас просто есть два события EXE, но это может быть 200. Или 1. Обратите внимание, что есть порядковый номер, и нам нужно его захватить.

Вторая часть последовательности всегда будет серией CONTENT.ACCESS событий с предисловием. Снова от 1 до бесконечности в длину.

Следующая демонстрация демонстрирует рабочий пример и, вероятно, передает концепцию лучше, чем я: Демо 1

Он прекрасно фиксирует полное совпадение, порядковый номер и событие в отдельных группах.

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

  • 1_11 / 08/2014 23: 03EXE_IN1_11 / 08/2014 23: 03EXE_CO2_12 / 08/2014 09: 17CONTENT_ACCESS3_13 / 08/2014 09: 17CONTENT_ACCESS

Мне нужно также захватить метки времени.

Я попытался скорректировать выражение регулярного выражения со смешанными результатами. Пожалуйста, посмотрите это демо: demo2

В идеале я бы хотел видеть что-то подобное для каждого события:

Match n
Full match  266-308 `2_12/08/2014 09:17CONTENT_ACCESS`
Group 1. 266-267    `2`
Group 2. 268-284    `12/08/2014 09:17`
Group 3. 284-308    `CONTENT_ACCESS`

Надеюсь, вы мне поможете. Тестирования REGEX101 pcre достаточно (для записи я использую Perl-совместимую функцию str_match_all_perl в R) .

Большое спасибо заранее.

1 Ответ

0 голосов
/ 15 сентября 2018

(\d+)_(.*?)(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/1

Из-за комментариев оно было изменено на (?:\G(?!^)(?(?=\d+_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}(?:EXE_CO|EXE_IN))(?<!\d_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}CONTENT_ACCESS))|(?=(?:\d+_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}(?:EXE_CO|EXE_IN))+(?:\d+_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}CONTENT_ACCESS)+))(\d+)_(\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2})(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/3

и еще одна версия, которая короче (?:\G(?!^)(?(?=\d+_.{16}(?:EXE_CO|EXE_IN))(?<!\d_.{16}CONTENT_ACCESS))|(?=(?:\d+_.{16}(?:EXE_CO|EXE_IN))+(?:\d+_.{16}CONTENT_ACCESS)+))(\d+)_(.{16})(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/4

И еще короче (?:\G(?!^)(?(?=\d+_.{16}E)(?<!S))|(?=(?:\d+_.{16}(?:EXE_CO|EXE_IN))+\d+_.{16}C))(\d+)_(.{16})(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/5

и супер короткие (?:\G|(?=\d+_.{16}E.*CON))(\d+)_(.*?)(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/8

...