Java 8 获取不带最后一个段的完整 URL 路径(带或不带尾部斜杠)



>我有如下网址,需要按如下方式修剪它们,没有最后一个段。可能有也可能没有尾随斜杠。

localhost:8080/myapp->localhost:8080/

https://myapp-dev.myhost.com/app/->https://myapp-dev.myhost.com/

https://myapp-dev.myhost.com/app/app2->https://myapp-dev.myhost.com/app/

当然,我可以尝试这样的解决方案

String[] tokens = uri.split("/"); // then concatenate previous ones...

Path path = Paths.get(uri.getPath());
String secondToLast = path.getName(path.getNameCount() - 2).toString();

但是没有一些更强大的实用程序或方法吗?

尝试将 url 字符串传递到 URL 对象中,然后拉出所需的段:

URL someURL = new URL("https://myapp-dev.myhost.com/app/");
System.out.println("PATH = " + someURL.getPath());
System.out.println("HOST = " + someURL.getHost());
System.out.println("PROTOCOL = " + someURL.getProtocol());
System.out.println("PORT = " + someURL.getPort());

输出:

路径 =/应用/

主机 = myapp-dev.myhost.com

协议 = https

端口 = 8080

如果您所需要的只是修剪最后一个"/"之后的所有内容(或者如果字符串以"/"结尾,则修剪倒数第二个(之后的所有内容,那么一个简单的函数可以解决这个问题:

public static void main(String[] args){ 
Function<String,String> trimUrlString = s -> { 
s = s.endsWith("/") ? s.substring(0, s.length()-1) : s;
return  s.substring(0, s.lastIndexOf('/')+1);
};
String u1 = "localhost:8080/myapp";        
System.out.println(trimUrlString.apply(u1));
String u2 = "https://myapp-dev.myhost.com/app/";     
System.out.println(trimUrlString.apply(u2));        
}
//output: localhost:8080/      https://myapp-dev.myhost.com/

编辑

另一个可能更短的方法是链接两个替换所有调用:

myString.replaceAll("/$", "").replaceAll("/[^/]+$", "/");

第一次调用将删除末尾的正斜杠(如果有(,如果末尾没有斜杠myString保持不变。然后,第二次调用将替换最后一个/之后的每个字符,这不是/

一些带有示例的测试用例:

String[] urls = {"localhost:8080/myapp",
"https://myapp-dev.myhost.com/app/test.pdf",
"http://myapp-dev.host.com/app/", 
"http://app.host.com:8080/app/app2"};
for(String url : urls){
String s = url.replaceAll("/$", "").replaceAll("/[^/]+$", "/");
System.out.println(url);
System.out.println(s); 
System.out.println();
}

您可以使用正则表达式拆分字符串,如我在注释中提到的那样。 我在正则表达式下面提供。

^https?://w+(:[0-9]*)?(.w+)?

您可以尝试以下示例。

https://mydomain:8080

http://localhost:8090

您还可以通过粘贴正则表达式和示例字符串来验证 https://rubular.com/。

使用String.lastIndexOfString.substring剥离最后一个组件。

像这样:

private String stripLastComponent(String path) {
int n = path.lastIndexOf('/');
if(n < 0) { // no / in path
return path;
}
String stripped = path.substring(0, n);
if(n == path.length()) { // '/' was last char, so try stripping again
stripped = stripLastComponent(stripped);
}
return stripped;
}

最新更新