Регулярное выражение для проверки InetSocketAddresses (ipv4 / v6 + адреса портов) - PullRequest
3 голосов
/ 21 апреля 2011

Я ищу проверенные регулярные выражения для ipv4 и ipv6 InetSocketAddress (т. Е. Адрес ip + номер порта).Я не заинтересован в проверке имен хостов.

Это может быть два регулярных выражения (одно для ipv4, одно для ipv6) или одно объединенное регулярное выражение.

Кто-нибудь может поделиться?1010 * РЕДАКТИРОВАТЬ

Информацию о формате ip4 см. здесь , информацию о формате ipv6 см. здесь .Затем номер порта добавляется с помощью ':'.

EDIT 2 Чтобы создать строковое представление, я буду действовать следующим образом:

byte[] tmp = { 10, 1, 0, 0 };
InetSocketAddress isa = new InetSocketAddress(
        InetAddress.getByAddress(tmp), 443);

, который возвращает:

/10.1.0.0:443

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Попытка использовать регулярное выражение для .toString() из InetSocketAddress для этого может быть не очень хорошей идеей. (см. комментарии к вопросу выше)

Одной из возможных альтернатив является использование URL или URI для печати адреса в строковом формате, который гораздо более стандартизирован .


Edit:

С другой стороны, если вы хотите мучить себя регулярными выражениями ...; -)

IPv4:

      Pattern: .*/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)
Java constant: ".*/([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+):([0-9]+)"

Обрабатывает только адреса в точечно-квадратичном формате. Не обнаруживает недействительные адреса.

IPv6:

      Pattern: .*/([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+(%[a-zA-Z0-9]+)?):([0-9]+)
Java constant: ".*/([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+(%[a-zA-Z0-9]+)?):([0-9]+)"

Обрабатывает IPv6-адреса со всеми 8 16-битными секциями. (еще раз обратите внимание, что единственная причина, по которой это работает, заключается в том, что реализация Inet6Address в Java, кажется, печатает адреса нестандартным способом - возможно, поэтому он может добавлять номер порта и нет двусмысленности) Не обнаруживает недопустимые адреса IPv6. Обрабатывает только строчные шестнадцатеричные символы. Обрабатывает идентификаторы зоны / области (если есть) с заглавными или строчными буквами и / или цифрами.

Я проверил их с помощью удобного апплета, который нашел .

И для протокола, я все еще думаю, что это плохая идея. ;-) Я не могу быть уверен, что все платформы Java будут печатать адреса таким образом.

1 голос
/ 22 апреля 2011

Плохая идея.Адреса IPv6 в форме RFC 5952 не являются обычным языком, поэтому их синтаксический анализ с регулярным выражением - это путь к провалу.Используйте правильную функцию синтаксического анализа, например, функцию POSIX inet_pton.У Java должен быть где-то один.Кто знает, возможно, он даже достаточно умен для обработки адресов IPv6 со встроенными подполями IPv4 в соответствии с разделом 5 RFC 5952.

Серьезно ... не используйте для этого регулярные выражения.

1 голос
/ 21 апреля 2011

Вы можете взглянуть на библиотеку регулярных выражений

...