Книга: Программирование на языке Ruby
3.14.1. Сопоставление с IP-адресом
3.14.1. Сопоставление с IP-адресом
Пусть мы хотим понять, содержит ли строка допустимый IPv4-адрес. Стандартно он записывается в точечно-десятичной нотации, то есть в виде четырех десятичных чисел, разделенных точками, причем каждое число должно находиться в диапазоне от 0 до 255.
Приведенный ниже образец решает эту задачу (за немногими исключениями типа «127.1»). Для удобства восприятия мы разобьем его на части. Отметим, что символ d дважды экранирован, чтобы косая черта не передавалась из строки в регулярное выражение (чуть ниже мы решим и эту проблему).
num = "(d|[01]?dd|2[0-4]d25[0-5])"
nd
pat = ^(#{num}.){3}#{num}$"
ip_pat = Regexp.new(pat)
ip1 = "9.53.97.102"
if ip1 =~ ip_pat # Печатается: "да"
puts "да"
else
puts "нет"
e
Надо признать, что в определении переменной num
слишком много символов обратной косой черты. Определим ее в виде регулярного выражения, а не строки:
num = /(d1[01]?dd|2[0-4]d|25[0-5])/
Когда одно регулярное выражение интерполируется в другое, вызывается метод to_s
, который сохраняет всю информацию из исходного регулярного выражения.
num.to_s # "(?-mix:(d|[01]?dd|2[0-4]d|25[0-5]))"
Иногда для встраивания удобно использовать регулярное выражение, а не строку. Хорошее эвристическое правило: интерполируйте регулярные выражения, если веских причин интерполировать строки.
IPv6-адреса пока не очень широко распространены, но для полноты рассмотрим и их. Они записываются в виде восьми шестнадцатеричных чисел, разделенных двоеточиями, с подавлением начальных нулей.
num = /[0-9A-Fa-f]{0,4}/
pat = /^(#{num}:){7}#{num}$/
ipv6_pat = Regexp.new(pat)
v6ip = "abcd::1324:ea54::dead::beef"
if v6ip =~ ipv6_pat # Печатается: "да"
puts "да"
else
puts "нет"
end
- 3.14.1. Сопоставление с IP-адресом
- 3.14.2. Сопоставление с парой «ключ-значение»
- 3.14.3. Сопоставление с числами, записанными римскими цифрами
- 3.14.4 Сопоставление с числовыми константами
- 3.14.5 Сопоставление с датой и временем
- 3.14.6. Обнаружение повторяющихся слов в тексте
- 3.14.7. Поиск слов, целиком набранных прописными буквами
- 3.14.8. Сопоставление с номером версии
- 3.14.9. Еще несколько образцов
- 3.14.5 Сопоставление с датой и временем
- 3.14.6. Обнаружение повторяющихся слов в тексте
- Глава 23 Сопоставление строк
- 3.14.8. Сопоставление с номером версии
- 3.14.2. Сопоставление с парой «ключ-значение»
- 3.14.7. Поиск слов, целиком набранных прописными буквами
- Я нашел интересный сайт, но со сложным адресом. Как его запомнить?
- 2.2. Сопоставление
- 12.7.1. Простое сопоставление с шаблоном: fnmatch()
- ПРИЛОЖЕНИЕ Б Сопоставление функций Windows, UNIX и библиотеки С
- Сопоставление с UNIX и библиотекой С
- Сопоставление строк с регулярными выражениями