Регулярное совпадение идентификатора пользователя с запятой - PullRequest
0 голосов
/ 12 октября 2019

Я сопоставляю идентификаторы пользователя с регулярным выражением (в Splunk) и обнаружил смешанные результаты:

Регулярное выражение ^[^=\n]*

https://regexr.com/4mn3d

Splunk Extraction ^[^=\n]*=(?P<user>[^ ]+)

Правила / Тестовые данные

  • firstname.lastname
  • A123456
  • имя-домена \ firstname.lastname
  • имя-домена \ A123456
  • фамилия, имя
  • фамилия, имя начальное

Пример журнала

Oct 3 23:33:00 2019 wc1 authmgr[4111]: <522008> <4904> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname MAC=d0:c6:25:79:e7:c6 IP=192.168.16.26 role=Authenticated VLAN=600 AP=43:4a:e3:c9:ec:0c SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv

Oct 3 22:42:27 2019 wc1 authmgr[4111]: <522008> <4111> <NOTI> <wc1 123.134.128.122> User Authentication Successful: username=lastname, firstname initial MAC=b2:09:cf:4c:80:1e IP=192.168.16.27 role=Authenticated VLAN=600 AP=34:fc:b2:c1:be:dc SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv

Ожидается

username=lastname, firstname

username=lastname, firstname initial

Матчи работают на regex.com, но lastname, firstname не совпадает в Splunk. Похоже, что текущее регулярное выражение останавливается на запятой.

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Не уверен, что я хорошо понимаю ваши потребности, но это то, что вы хотите:

(\w+)=(.+?)(?=\s\w+=|$)

Демонстрация и объяснение

1 голос
/ 12 октября 2019

Причина, по которой ваш Regex работает в одном месте, но не в другом, может быть связана с различными вкусами / движками Regex, используемыми в regexr.com и Splunk.

Следующее Regex должно работать дляВаш вариант использования:
^[^=]*=([^=]*)(?=\s)

Однако имя пользователя не должно содержать знак равенства, чтобы Regex работал. Это может быть достигнуто путем очистки пользовательского ввода от буквенно-цифровых символов плюс специальных символов, которые вы указали (".", "\", Пробелы) и т. Д.

const logEntries = `Oct  3 23:33:00 2019 wc1 authmgr[4111]: <522008> <4904> <NOTI> <wc1 123.134.128.122>  User Authentication Successful: username=lastname, firstname MAC=d0:c6:25:79:e7:c6 IP=192.168.16.26 role=Authenticated VLAN=600 AP=43:4a:e3:c9:ec:0c SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv

Oct  3 22:42:27 2019 wc1 authmgr[4111]: <522008> <4111> <NOTI> <wc1 123.134.128.122>  User Authentication Successful: username=lastname, firstname initial MAC=b2:09:cf:4c:80:1e IP=192.168.16.27 role=Authenticated VLAN=600 AP=34:fc:b2:c1:be:dc SSID=corpnet AAA profile=aaaprof auth method=802.1x auth server=authserv`;

let result;

logEntries.split(/\n/).map((entry) => {
  result = entry.match(/^[^=]*=([^=]*)(?=\s)/);

  if (result) {
    console.log(result[1]);
  }
});

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

ОбъяснениеРегулярное выражение:

^ - устанавливает позицию в начале строки
[^=] - соответствует всему, что не является буквальным знаком равенства (=)
* - соответствует нулю и неограниченному числу раз
= - соответствует литеральному знаку равенства
([^=]*) - группа захвата, которая соответствует чему-либо, что не является литеральным знаком равенства
(?=\s) - положительный прогноз, утверждающий, что то, что сразу следует за текущей позицией встрока является пробелом

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