Я сам предлагаю одно возможное обходное решение.
Преобразуйте строку в URI (это автоматически проверит ее), а затем запросите компоненты хоста и порта URI.
К сожалению, URI с хост-компонентом ДОЛЖЕН иметь схему. Вот почему это решение "не идеально".
String string = ... // some string which has to be validated
try {
// WORKAROUND: add any scheme to make the resulting URI valid.
URI uri = new URI("my://" + string); // may throw URISyntaxException
String host = uri.getHost();
int port = uri.getPort();
if (uri.getHost() == null || uri.getPort() == -1) {
throw new URISyntaxException(uri.toString(),
"URI must have host and port parts");
}
// here, additional checks can be performed, such as
// presence of path, query, fragment, ...
// validation succeeded
return new InetSocketAddress (host, port);
} catch (URISyntaxException ex) {
// validation failed
}
Это решение не требует пользовательского разбора строк , работает с IPv4 (1.1.1.1:123
), IPv6 ([::0]:123
) и имен хостов (my.host.com:123
).
Случайно, это решение хорошо подходит для моего сценария. В любом случае я собирался использовать схемы URI.