Как объединить два регулярных выражения с «наполнителями» между ними? - PullRequest
0 голосов
/ 03 мая 2019

Фон

Я хочу разработать программу для извлечения полей из неструктурированных данных журнала.Я использую grok для определения регулярных выражений, которые соответствуют входной строке.В то время как я достиг части, где я идентифицирую регулярные выражения, я хочу объединить идентифицированные регулярные выражения в одно, чтобы соответствовать всей строке

Пример -

Рассмотрим строку журнала CISCO PIX-

Mar 29 2004 09:54:18: %PIX-6-302005: Built UDP connection for faddr 198.207.223.240/53337 gaddr 10.0.0.187/53 laddr 192.168.0.2/53

Для приведенного выше логина я выделяю следующие регулярные выражения -

CISCOTIMESTAMP - \b(?:Jan(?:uary|uar)?|Feb(?:ruary|ruar)?|M(?:a|ä)?r(?:ch|z)?|Apr(?:il)?|Ma(?:y|i)?|Jun(?:e|i)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|O(?:c|k)?t(?:ober)?|Nov(?:ember)?|De(?:c|z)(?:ember)?)\b +(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])(?: (?>\d\d){1,2})? (?!<[0-9])(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9])(?::(?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?))(?![0-9])

CISCOTAG - [A-Z0-9]+-(?:[+-]?(?:[0-9]+))-(?:[A-Z0-9_]+)

CISCOACTION - Built|Teardown|Deny|Denied|denied|requested|permitted|denied by ACL|discarded|est-allowed|Dropping|created|deleted

IPV4 - (?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])

URIPATH - (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+(?:\?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]<>]*)?


Задача

Теперь я хочу merge эти регулярные выражения вместе, но я также хочу включить в них заполнители.Пример -

Built|Teardown|Deny|Denied|denied|requested|permitted|denied by ACL|discarded|est-allowed|Dropping|created|deleted

Это регулярное выражение совпадает со словом Built в строке журнала, а -

(?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])

идентифицирует первое 198.207.223.240 (IP Address).

Однако, когда я объединяю их вместе в regex101.com следующим образом -

(Built|Teardown|Deny|Denied|denied|requested|permitted|denied by ACL|discarded|est-allowed|Dropping|created|deleted) ((?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9]))

Они не очень хорошо склеиваются, очевидно, потому что между ними есть слова - UDP connection for faddr - которые я называю '

Я хочу объединить захваченные регулярные выражения при рассмотрении произвольных «заполнителей» между ними.

Есть ли способ сделать это?


Мой подход

Я пытался использовать (.*) и (.*?), но они слишком мощные , то есть заменяют другие шаблоны исоответствует всей оставшейся строке.


Может кто-нибудь помочь мне в достижении желаемого результата?

Идеальный результат будет -

CISCOTIMESTAMP + [РЕЖИМ ЗАПОЛНЕНИЯ]+ CISCOTAG + [REGEX FILLER] + CISCOACTION + [REGEX FILLER] + IPv4 + URIPATH + и так далее.

1 Ответ

0 голосов
/ 03 мая 2019

URIPATH выключен на regex101. Вы не сбежали '/'
Как только это сделано, это работает.

URIPATH: ((?:\/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+(?:\?[A-Za-z0-9$.+!*'|(){},~@#%&\/=:;_?\-\[\]<>]*)?)

И с этим все остальное работает, с. * В качестве регулярного выражения.

CISCOTIMESTAMP + [РЕГИОС ЗАПОЛНИТЕЛЯ] + CISCOTAG + [РЕЙГЕР ЗАПОЛНИТЕЛЯ] + CISCOACTION + [РЕГ. ЗАПОЛНЕНИЯ] + IPv4 + URIPATH

Все регулярные выражения ниже

(\b(?:Jan(?:uary|uar)?|Feb(?:ruary|ruar)?|M(?:a|ä)?r(?:ch|z)?|Apr(?:il)?|Ma(?:y|i)?|Jun(?:e|i)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|O(?:c|k)?t(?:ober)?|Nov(?:ember)?|De(?:c|z)(?:ember)?)\b +(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])(?: (?>\d\d){1,2})? (?!<[0-9])(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9])(?::(?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?))(?![0-9])).*([A-Z0-9]+-(?:[+-]?(?:[0-9]+))-(?:[A-Z0-9_]+)).*(Built|Teardown|Deny|Denied|denied|requested|permitted|denied by ACL|discarded|est-allowed|Dropping|created|deleted).*((?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9]))((?:\/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+(?:\?[A-Za-z0-9$.+!*'|(){},~@#%&\/=:;_?\-\[\]<>]*)?)

Вот ссылка на демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...