Regex Negative Lookahead с использованием группы, определенной ранее в совпадении - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь написать регулярное выражение для анализа файла журнала, созданного несколькими сотнями наших маршрутизаторов.Журнал - это скрипт, который пытается пропинговать каждый из других маршрутизаторов в среде.Это для соответствия, чтобы доказать, что мы не можем пропинговать каждый из других маршрутизаторов в среде.Журналы выглядят подобно следующему отрывку (только намного больше).

Interface Name = INTNET1
IP Address                     =   192.168.200.200,

---PING Section---
PING 192.168.200.200: 56 data bytes
64 bytes from 192.168.200.200: icmp_seq=0. time=0. ms
64 bytes from 192.168.200.200: icmp_seq=1. time=0. ms
----192.168.200.200 PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss
round-trip (ms)  min/avg/max = 0/0/0
no answer from 192.168.12.13
no answer from 192.168.151.1
no answer from 192.168.19.1
no answer from 192.168.84.1
64 bytes from 192.168.100.100: icmp_seq=0. time=0. ms
64 bytes from 192.168.100.100: icmp_seq=1. time=0. ms
----192.168.100.100 PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss
round-trip (ms)  min/avg/max = 0/0/0

Поскольку все маршрутизаторы перечислены в сценарии, каждый маршрутизатор пропингует себя и получает положительный ответ.Используя это, чтобы собрать mgmt маршрутизатора.IP:

IP\sAddress\s*\=\s*(?<MGMTIP>.*)

Я хочу негативно посмотреть на совпадения следующего шаблона (строки статистики PING)

\-\-\-\-(.*)\-\-\-\-

и совпадать только в том случае, если адрес не совпадаетс названной группой.Я уже давно над этим работаю и просто не могу заставить его работать.

РЕДАКТИРОВАТЬ: Интересно, не слишком ли это усложняю?Все, что мне действительно нужно из всего этого строкового блока, - это сопоставить любые строки с этим шаблоном:

\-\-\-\-(.*)\-\-\-\-

Но захватить часть '(. *)', Только если она не соответствует Группе 1 из этого шаблона(соответствует IP-адресу хоста, выдающего эхо-запросы)

IP\sAddress\s*\=\s*(.*)

1 Ответ

0 голосов
/ 10 сентября 2018

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

IP\sAddress\s*\=\s*(?<MGMTIP>.*)

Мы сохраним это в переменной с именем "myIP" (если вы действительно беспокоитесь о точности, вам нужно экранировать каждый . в "myIP")потому что с regex . соответствует любому символу. Скорее всего, это не будет иметь значения)

Ваш следующий шаблон должен быть "(?s)----" + myIP + "\sPING\sStatistics----.*?(?=----\d+\.\d+\.\d+\.\d+\sPING\sStatistics----|\Z)"

Это будет соответствовать каждому разделу, который вы надеваете'1014 * хочу.Вы можете заменить любой из этих совпадений на "", и в нем останутся все нужные разделы.

Демо

...