Обработка правил брандмауэра Windows с помощью javascript и regex

Рейтинг: 0Ответов: 1Опубликовано: 01.02.2023

Пытаюсь структурировать результат консольной команды netsh advfirewall firewall show rule dir=in name=all profile=private с помощью js
Примерно вот так оно выглядит:

Имя правила:                          VMware Authd Service (private)
----------------------------------------------------------------------
Включен:                              Да
Направление:                          Вход
Profiles:                             Частный
Группировка:
LocalIP:                              Любой
Удаленный IP-адрес:                   LocalSubnet
Протокол:                             Любой
Обход узлов:                          Да
Действие:                             Разрешить

Имя правила:                          Сервер потоковой передачи на устройство (потоковая передача, RTSP - входящий)
----------------------------------------------------------------------
Включен:                              Да
Направление:                          Вход
Profiles:                             Частный
Группировка:                          Функция "Передать на устройство"
LocalIP:                              Любой
Удаленный IP-адрес:                   LocalSubnet
Протокол:                             TCP
Локальный порт:                       23554,23555,23556
Удаленный порт:                       Любой
Обход узлов:                          Нет
Действие:                             Разрешить

Хотел разделить их регулярным выражением и потом split'ом
Однако, написать такую регулярку не получилось
Примерно так должно выглядеть на выходе:

Совпадение 1:

Имя правила:                          VMware Authd Service (private)
----------------------------------------------------------------------
Включен:                              Да
Направление:                          Вход
Profiles:                             Частный
Группировка:
LocalIP:                              Любой
Удаленный IP-адрес:                   LocalSubnet
Протокол:                             Любой
Обход узлов:                          Да
Действие:                             Разрешить

Совпадение 2:

Имя правила:                          Сервер потоковой передачи на устройство (потоковая передача, RTSP - входящий)
----------------------------------------------------------------------
Включен:                              Да
Направление:                          Вход
Profiles:                             Частный
Группировка:                          Функция "Передать на устройство"
LocalIP:                              Любой
Удаленный IP-адрес:                   LocalSubnet
Протокол:                             TCP
Локальный порт:                       23554,23555,23556
Удаленный порт:                       Любой
Обход узлов:                          Нет
Действие:                             Разрешить

В общем, нужна помощь с регуляркой для этой задачки

Ответы

▲ 0Принят

Алгоритм:

  • Разделение текста на строки. Тут удобно использовать split с регулярным выражением \r?\n (строки заканчиваются на \r\n или на \n)
  • Перебор строк. Можно циклом, можно функцией
  • Проверка наличия строки с "Имя правила:"
  • Эту строку и следующие добавляйте в под массив rule

В результате получите массив из массивов

Пример:

let text = `\
Имя правила:                          VMware Authd Service (private)
----------------------------------------------------------------------
Включен:                              Да
Направление:                          Вход
Profiles:                             Частный
Группировка:
LocalIP:                              Любой
Удаленный IP-адрес:                   LocalSubnet
Протокол:                             Любой
Обход узлов:                          Да
Действие:                             Разрешить

Имя правила:                          Сервер потоковой передачи на устройство (потоковая передача, RTSP - входящий)
----------------------------------------------------------------------
Включен:                              Да
Направление:                          Вход
Profiles:                             Частный
Группировка:                          Функция "Передать на устройство"
LocalIP:                              Любой
Удаленный IP-адрес:                   LocalSubnet
Протокол:                             TCP
Локальный порт:                       23554,23555,23556
Удаленный порт:                       Любой
Обход узлов:                          Нет
Действие:                             Разрешить
`;
let lines = text.split(/\r?\n/);
let rules = [];
let rule = null;
for (let line of lines) {
    if (line.includes('Имя правила:')) {
        rule = [];
        rules.push(rule);
    }
    if (rule != null) {
        rule.push(line);
    }
}

console.log(rules);