Анализ полного доменного имени и элемента из журнала событий

#javascript #regex

Вопрос:

Я получаю этот текст события, и мне нужно иметь возможность проанализировать полное доменное имя для каждой строки вместе с именем аспекта. Я перепробовал несколько примеров регулярных выражений полного доменного имени, и единственное, что приблизилось, — ^[^.] это то, что по-прежнему фиксируется только имя хоста, с которым я был бы в порядке. Но я, похоже, не могу захватить оба набора данных.

Пример:

Строка: Тест1.тест.локальная система Зарезервирована 73.2 %

Выход:

Полное доменное имя = Test1.test.local

Имя аспекта = Зарезервировано для системы

 'Performance Disk Utilization Exceeds 50%' threshold
 
Description: Average disk utilization during the past 2 minutes exceeds 50%
 
New Items (11)
 
Occurred at 10/21/2021 10:38:06 AM
 
Display Name Aspect Name Aspect Value
Test1.test.local System Reserved 73.2 %
Test1-stage.test.local System Reserved 69.3 %
test-stage.test.local \?Volume{c2e5b983-0000-0000-0000-006225000000} 83.3 %
test2.test.local System Reserved 73.2 %
test2.test.local E: - Data 62.5 %
test.test.LOCAL System Reserved 69.3 %
test.test.LOCAL \?Volume{0833abcb-0000-0000-0000-006225000000} 83.3 %
test3.test.local System Reserved 69.4 %
test3.test.local E: - SCCM 85.7 %
test3.cdp.local C: 53.1 %
test3.cdp.local \?Volume{fa03c719-0000-0000-0000-f0e17c000000} 83.3 %
 

Ответ №1:

Вы можете использовать 2 группы захвата и сопоставить число в конце, за которым следует знак процента:

 ([^s.] (?:.[^s.] ) ) (. ?) d (?:.d )? %
 
  • ( Группа захвата 1
    • [^s.] Сопоставьте 1 символов, отличных от символа пробела или .
    • (?:.[^s.] ) Повторите 1 раз, сопоставляя точку, за которой следует 1 символов, отличных от символа пробела, или . чтобы сопоставить хотя бы одну точку
  • ) Близкая группа 1
  • (. ?) Запишите 1 или более цифр в группе 2 между 2 пробелами
  • d (?:.d )? % Сопоставьте 1 цифр с необязательной десятичной частью и %

демонстрация регулярных выражений

 const regex = /([^s.] (?:.[^s.] ) ) (. ?) d (?:.d )? %/gm;
const str = `Test1.test.local System Reserved 73.2 %
Test1-stage.test.local System Reserved 69.3 %
test-stage.test.local \\?\Volume{c2e5b983-0000-0000-0000-006225000000}\ 83.3 %
test2.test.local System Reserved 73.2 %
test2.test.local E:\ - Data 62.5 %
test.test.LOCAL System Reserved 69.3 %
test.test.LOCAL \\?\Volume{0833abcb-0000-0000-0000-006225000000}\ 83.3 %
test3.test.local System Reserved 69.4 %
test3.test.local E:\ - SCCM 85.7 %
test3.cdp.local C:\ 53.1 %
test3.cdp.local \\?\Volume{fa03c719-0000-0000-0000-f0e17c000000}\ 83.3 %`;

console.log(Array.from(str.matchAll(regex), m => ({
  "FQDN": m[1],
  "AspectName": m[2]
})));