代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static String extractFilenameFromUrl(String url) {
Pattern pattern = Pattern.compile(".*/([^?]+)(?:\\?.*)?");
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
public static void main(String[] args) {
String url = "http://192.168.1.1:8080/projects/313601/Origin/92507904.png?X-Amz-Algorithm=AWS4-HMAC-SHA256";
String filename = extractFilenameFromUrl(url);
System.out.println(filename); // 输出: 92507904.png
}
}
可以从url提取文件名:92507904.png
。
正则含义
.*/([^?]+)(?:\\?.*)?
的含义:
1、.*/
.*
:匹配任意字符(除换行符)零次或多次(贪婪模式,会尽可能匹配到最后一个/
)。/
:匹配字面的 / 字符(跳过所有字符,直到找到最后一个/
)。
2、 ([^?]+)
:捕获最后一个/
之后、第一个?
之前的所有字符(即路径的最后一段)。
-
[^?]+
:匹配一个或多个非?
的字符([^?]
是排除?
的字符集)。 -
用
()
捕获,表示提取这部分内容。
3、 (?:\\?.*)?
:忽略查询参数部分(?key=value),但不捕获它。
(?:)
:非捕获分组。\\?
是转义,以匹配?
,还匹配其后的任意字符.*
,整个分组是可选的()?
。