我自己提出了一个可能的解决方法。
将字符串转换为 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 ()、IPv6 () 和主机名 ()。1.1.1.1:123
[::0]:123
my.host.com:123
意外地,此解决方案非常适合我的方案。无论如何,我打算使用URI方案。