Добрый вечер.
В книге Бена Форта «Регулярные выражения. 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-адрес полностью?
В книге Бена Форта «Регулярные выражения. 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-адрес полностью?