在 Java 開發中,從 URL 字串中解析出主機名是常見需求。雖然可使用 java.net.URL 類別,但正則表達式提供更輕量、靈活的替代方案,尤其適合簡單解析場景。
以下方法使用正向前瞻斷言 (?<=//|) 定位協議後的雙斜線或字串開頭,隨後匹配由字母數字、底線與點組成的主機名:
public static String getHost(String url) {
if (url == null || url.trim().isEmpty()) {
return "";
}
String host = "";
// 正則:(?<=//|) 表示前面是 // 或字串開頭;((\w)+\.)+\w+ 匹配域名結構
Pattern pattern = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+");
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
host = matcher.group();
}
return host;
}
(?<=//|):不消耗字元,僅確保匹配位置緊跟 // 或字串起始,避免協議部分被捕獲。((\w)+\.)+\w+:匹配 www.example.com 這類結構,\w 涵蓋字母、數字、底線。null 或空白時直接返回空字串,避免 NullPointerException。| 輸入 URL | 輸出 Host |
|---|---|
https://www.example.com/path | www.example.com |
https://api.service.org:8080 | api.service.org |
ftp://files.demo.net | files.demo.net |
localhost:8080 | localhost |
優點:無需拋棄式解析、效能較好、程式碼簡潔。
缺點:無法處理 IPv6 位址([::1])、帶認證資訊的 URL(user:pass@host)或非標準連接埠;嚴格場景建議改用 java.net.URI 或 HttpClient 解析。
若專案已引入 Apache HttpClient,可直接使用 URIBuilder 或 HttpHost 獲得更健壯的解析;若為 Android 環境,android.net.Uri 同樣提供開箱即用的 getHost()。