Tôi không thích bất kỳ triển khai nào (vì chúng sử dụng Regex là một hoạt động đắt tiền hoặc một thư viện là quá mức cần thiết nếu bạn chỉ cần một phương thức), vì vậy tôi đã kết thúc bằng cách sử dụng lớp java.net.URI với một số kiểm tra bổ sung và giới hạn các giao thức đối với: http, https, file, ftp, mailto, news, urn.
Và vâng, bắt các ngoại lệ có thể là một hoạt động tốn kém, nhưng có lẽ không tệ như Biểu thức chính quy:
final static Set<String> protocols, protocolsWithHost;
static {
protocolsWithHost = new HashSet<String>(
Arrays.asList( new String[]{ "file", "ftp", "http", "https" } )
);
protocols = new HashSet<String>(
Arrays.asList( new String[]{ "mailto", "news", "urn" } )
);
protocols.addAll(protocolsWithHost);
}
public static boolean isURI(String str) {
int colon = str.indexOf(':');
if (colon < 3) return false;
String proto = str.substring(0, colon).toLowerCase();
if (!protocols.contains(proto)) return false;
try {
URI uri = new URI(str);
if (protocolsWithHost.contains(proto)) {
if (uri.getHost() == null) return false;
String path = uri.getPath();
if (path != null) {
for (int i=path.length()-1; i >= 0; i--) {
if ("?<>:*|\"".indexOf( path.charAt(i) ) > -1)
return false;
}
}
}
return true;
} catch ( Exception ex ) {}
return false;
}