Java正则表达式匹配URL
在Java中使用正则表达式匹配URL是一个常见的需求,下面我将提供一个全面且实用的解决方案。

基本URL匹配正则表达式
以下是一个相对完整的URL匹配正则表达式:
String urlRegex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
正则表达式解释:
^- 字符串开始(https?|ftp|file)- 匹配协议部分(http, https, ftp, file)- - 匹配://
[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*- 匹配URL主体部分[-a-zA-Z0-9+&@#/%=~_|]- 确保URL以有效字符结尾- - 字符串结束
更全面的URL匹配正则表达式
如果需要更全面的匹配,可以使用以下正则表达式:
String urlRegex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]$" +
"|^(www.)[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]$" +
"|^[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+@#/%=~_|]\\.[-a-zA-Z]{2,}\\.?[-a-zA-Z]{2,}$";
Java代码示例
简单验证URL
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class UrlValidator {
private static final String URL_REGEX = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
private static final Pattern URL_PATTERN = Pattern.compile(URL_REGEX);
public static boolean isValidUrl(String url) {
if (url == null) {
return false;
}
Matcher matcher = URL_PATTERN.matcher(url);
return matcher.matches();
}
public static void main(String[] args) {
String[] testUrls = {
"http://example.com",
"https://www.example.com/path?query=value",
"ftp://files.example.com",
"file:///C:/path/to/file",
"www.example.com", // 不匹配,因为没有协议
"example.com", // 不匹配,因为没有协议
"not a url"
};
for (String url : testUrls) {
System.out.println(url + " : " + isValidUrl(url));
}
}
}
提取URL中的各个部分
如果需要从URL中提取协议、域名、路径等部分,可以使用以下方法:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UrlParser {
private static final String URL_REGEX =
"^(?<protocol>https?|ftp|file)://" +
"(?<host>[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|])" +
"(?<path>/.*)?$";
private static final Pattern URL_PATTERN = Pattern.compile(URL_REGEX);
public static void parseUrl(String url) {
Matcher matcher = URL_PATTERN.matcher(url);
if (matcher.matches()) {
System.out.println("完整URL: " + url);
System.out.println("协议: " + matcher.group("protocol"));
System.out.println("主机: " + matcher.group("host"));
System.out.println("路径: " + (matcher.group("path") != null ? matcher.group("path") : "/"));
} else {
System.out.println("无效的URL: " + url);
}
}
public static void main(String[] args) {
parseUrl("https://www.example.com/path/to/resource?query=value");
parseUrl("http://localhost:8080");
parseUrl("ftp://files.example.com/download");
}
}
查找文本中的所有URL
如果需要从文本中提取所有URL:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UrlExtractor {
private static final String URL_REGEX =
"\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_]\\b|" +
"\\bwww\\.[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_]\\b|" +
"\\b[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+@#/%=~_]\\.[a-zA-Z]{2,}\\b";
private static final Pattern URL_PATTERN = Pattern.compile(URL_REGEX);
public static void main(String[] args) {
String text = "访问 https://www.example.com 或 http://test.com 查看更多信息,也可以访问 www.another-site.org。";
Matcher matcher = URL_PATTERN.matcher(text);
while (matcher.find()) {
System.out.println("找到URL: " + matcher.group());
}
}
}
注意事项
-
正则表达式局限性:正则表达式无法完全验证URL的语义正确性,特别是对于复杂的URL结构。
-
性能考虑:对于大量URL验证,预编译正则表达式(如
Pattern.compile())可以提高性能。 -
国际化域名:上述正则表达式不包含国际化域名(IDN)的支持,如果需要支持,可以使用
java.net.IDN类进行转换。 -
更复杂的验证:对于生产环境,建议使用专门的URL解析库如Apache HttpClient或Java的
java.net.URL类进行更严格的验证。
(图片来源网络,侵删) -
安全考虑:在处理用户提供的URL时,要注意潜在的安全风险,如开放重定向攻击。
希望这些示例能帮助你在Java中有效地使用正则表达式匹配URL!
