Мой Regex для поиска IP-адресов работает, но как исключить определенные IP-адреса - PullRequest
0 голосов
/ 06 октября 2019

См. Пример на Rubular.com

Это работает, чтобы найти IP из error.log

((?:[0-9]{1,3}\.){3}[0-9]{1,3}).+(not found or unable to stat)

, но мне нужно игнорировать / исключать некоторые IP-адреса, например

((?:[0-9]{1,3}\.){3}[0-9]{1,3}).+(not found or unable to stat)(?!563.77.198.102)

но это не работает. Спасибо за подсказку, где я ошибаюсь.

Ответы [ 2 ]

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

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

/discard this|(capture)/
/discard this|and this|(capture)/

Итак, если вы хотите пропустить некоторые IP-адреса, поместите их слева и запишите то, что вы хотите справа:

563\.77\.198\.102|((?:[0-9]{1,3}\.){3}[0-9]{1,3}).+(not found or unable to stat)

Regex101 demo

Rubular demo

Если вы изучите захваченный контент, вы увидите, что для каждой строки, кроме исключенного IP, заполняются группы захвата.

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

Отрицательный прогноз в конце всегда будет верным, так как после not found or unable to stat номер ip отсутствует. Но это не дает желаемой проверки.

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

Вы также можете добавить границу слова после последних 3 цифр [0-9]{1,3}\b, так как шаблон продолжается с .+, который будет соответствовать любому символу 1+ раз, а также может совпадать с цифрой.

Примечание для экранирования точкив буквальном смысле.

\b((?!563\.77\.198\.102)(?:[0-9]{1,3}\.){3}[0-9]{1,3})\b.+(not found or unable to stat)

О шаблоне

  • \b( Граница слова, захват группа 1
    • (?!563\.77\.198\.102)Отрицательный взгляд, если то, что находится прямо справа, это не ip
    • (?:[0-9]{1,3}\.){3}[0-9]{1,3} Соответствует ip как число
  • )\b Закрыть группу 1 и границу слова
  • .+ Соответствует любому символу кроме символа новой строки 1+ раз
  • (not found or unable to stat) Захват текста в группе 2

Рубулярная демка

...