AD FS регистрирует множественное извлечение ip через Regex - PullRequest
0 голосов
/ 02 октября 2018

Застрял в вопросе регулярных выражений pcre.Я пытаюсь извлечь все ips, следующие за полем («IP-адрес клиента:») в журнале AD FS.
Мой журнал выглядит следующим образом (усечено для экономии места):

EventCode=411
EventType=0
Type=Information
SidType=1
TaskCategory=Printers
OpCode=Info
Token Type: 
http://schemas.microsoft.com/ws/2006/05/identitymodel/tokens/UserName  

Client IP: 
110.19.100.155,2603:1032:205:14::5 

Error message: 
******-This user can't sign in because this account is currently disabled 

Итак, конецжелаемый результат заключается в том, что я получаю оба ip-адреса в поле src_ip, и что он пробует регулярное выражение только в том случае, если он находит EventCode = 411 или 512 и т. д.1007 *

(\s\n|,)(?<src_ip>(?:(?:\d{1,3}\.){3}(?:\d{1,3}))|(?:(?:::)?(?:[\dA-Fa-f]{1,4}:{1,2}){1,7}(?:[\d\%A-Fa-z\.]+)?(?:::)?)|(?:::[\dA-Fa-f\.]{1,15})|(?:::))

Работает, но не различает события только с необходимыми кодами событий.Поэтому, когда я делаю это:

(?ms)(?:EventCode=(411|512))\n.*?(\s\n|,)(?P<src_ip>(?:(?:\d{1,3}\.){3}(?:\d{1,3}))|(?:(?:::)?(?:[\dA-Fa-f]{1,4}:{1,2}){1,7}(?:[\d\%A-Fa-z\.]+)?(?:::)?)|(?:::[\dA-Fa-f\.]{1,15})|(?:::))

Он подхватывает только первый IP.

Есть идеи?

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете слегка изменить свой шаблон, добавив пользовательскую границу на основе оператора \G, который соответствует началу строки или, что вам нужно здесь, концу предыдущего успешного соответствия:

(?ms)(?:\G(?!\A)\s*,\s*|EventCode=(411|512)\n.*?\R)\K(?P<src_ip>(?:\d{1,3}\.){3}(?:\d{1,3})|(?:::)?(?:[\dA-Fa-f]{1,4}:{1,2}){1,7}[\d%A-Fa-f.]*(?:::)?|::[\dA-Fa-f.]{1,15}|::)

См. Демонстрационную версию regex .

. Основное отличие состоит в (?:\G(?!\A)\s*,\s*|EventCode=(411|512)\n.*?\R)\K:

  • \G(?!\A)\s*,\s* - конце предыдущего успешного совпадения (начало позиции строки было вычтено с отрицательным знаком (?!\A)), затем запятой, заключенной в 0+ пробелов
  • | - или
  • EventCode=(411|512)\n.*?\R - EventCode= подстроказатем (411|512) захватывает 411 или 512 в группу 1, затем \R соответствует разрыву строки, а .*?\R соответствует любому количеству 0+ символов как можно меньше, вплоть до другого перехода строки, за которым последуетпоследующие подшаблоны)
  • \K - оператор сброса совпадений, отбрасывающий весь сопоставленный текст так далеко от всего буфера совпадений.

У вас также возникла небольшая проблема: [\d\%A-Fa-z\.] должно быть записанокак [\d\%A-Fa-f.].

...