>我有如下网址,需要按如下方式修剪它们,没有最后一个段。可能有也可能没有尾随斜杠。
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.lastIndexOf
和String.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;
}