Поиск ip-адреса (внести правку в рег. выражение)

  • Автор темы Автор темы Dziglo
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Dziglo

Участник
Топикстартер
Сообщения
226
Реакции
1
Добрый вечер.
В книге Бена Форта «Регулярные выражения. 10 минут на урок» есть пример регулярного выражения, которое ищет ip-адреса.
Вот оно:
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))

Вот расшифровка автора (в объяснении все понятно):
Рассмотрим, как работает этот шаблон. Прежде всего отметим, что он работает потому, что в нем используется ряд вложенных подвыражений. Проанализируем, например, следующее выражение, содержащее 4 подвыражения:

(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.)

Подвыражение (\d{1,2}) находит любое число в диапазоне от 0 до 99. Подвыражение (1\d{2}) соответствует любому трехзначному числу, начинающемуся с 1 (после 1 следуют любые две цифры), т.е. любому числу в диапазоне от 100 до 199. Подвыражение (2[0-4]\d) находит числа от 200 до 249, а (25[0-5]) находит числа от 250 до 255. Каждое из этих подвыражений является операндом другого подвыражения, составленного из этих подвыражений-операндов с помощью знака операции |. Поэтому будет выполняться поиск числа, соответствующего одному из этих подвыражений, а не всем. После диапазона чисел следует шаблон \., поэтому будет выполняться поиск точки. Так что полученное подвыражение соответствует всей последовательности цифр и точке (всему числу и точке после него). Это подвыражение заключено в скобки, т.е. само рассматривается как часть подвыражения, которое повторяется три раза с помощью {3}. В конце диапазон чисел повторяется снова, но на этот раз после него нет шаблона \.; этот диапазон как раз и соответствует последнему числу в IP-адресе. Именно благодаря тому, что каждое из четырех чисел находится в диапазоне от 0 до 255, этот шаблон действительно находит все правильные IP-адреса и отвергает все ошибочные.


Допустим, есть такой ip-адрес: 98.120.155.242.
Регулярное выражение находит 98.120.155.24
то есть последнюю цифру не находит. Очевидно подвыражению ((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])) в рег. выражении отвечает не только 242 в адресе, но и 24. На нем он и останавливается.
ВОПРОС: Как исправить регулярное выражение выражение, чтобы оно находило ip-адрес полностью?
 
  • Спасибо
Реакции: NNN5 и Dziglo
что-то не понял мысли со звездочкой )
немного переделал выражение, чтобы уж действительно искал из диапазона 0..255
Код:
(((2[0-4]\d)|(25[0-5])|(1\d{2})|((?<!\d)\d{1,2}))\.){3}((2[0-4]\d)|(25[0-5])|(1\d{2})|(\d{1,2}(?!\d)))
 
  • Спасибо
Реакции: Dziglo
@azz, вот это подвыражение не могли бы расшифровать?
(?!\d)
 
(?!) - отрицательный просмотр вперед, если есть после \d{1,2} еще одна цифра — то не находит...
это чтобы найти двузначные и исключить все, что после 255.
 
  • Спасибо
Реакции: Dziglo
Статус
Закрыто для дальнейших ответов.