Попытка использовать регулярное выражение для .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 будут печатать адреса таким образом.