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

Java 8获取完整URL路径,不带最后一段(带或不带尾随斜杠),java,Java,我有如下网址,需要修剪他们没有最后一段如下。可能有也可能没有尾部斜杠 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.spli

我有如下网址,需要修剪他们没有最后一段如下。可能有也可能没有尾部斜杠

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(“/”);//然后连接前面的…


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

尝试将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());
输出:

路径=/app/

HOST=myapp-dev.myhost.com

协议=https


PORT=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
保持不变。然后,第二个调用将替换最后一个
/
之后的每个字符,该字符不是
/

一些测试用例和您的示例:

    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+)?
您可以尝试以下示例


您还可以通过粘贴正则表达式和示例字符串来验证。使用
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;
}
私有字符串stripLastComponent(字符串路径){
int n=path.lastIndexOf('/');
如果(n<0){//no/in路径
返回路径;
}
String stripped=path.substring(0,n);
如果(n==path.length()){/'/'是最后一个字符,请再次尝试剥离
剥离=剥离组件(剥离);
}
返回剥离;
}

您可以使用Regex进行拆分并获取部分。非常感谢专家们提出的特定Regex建议。谢谢,但我失去了端口:
http://localhost:8080/app
-->
localhost
使用主机这将在localhost:8080/myapp上引发异常,因为URL需要架构。In-URI模式是可选的(但仍然与您的情况不匹配)。使用regexTrue可能会更好,如果没有定义协议,则会抛出畸形的DurLexException。这还有一些其他问题:假设我不需要第一个术语,我需要最后一个术语之前的所有术语。像
http://myapp.host.com/part1/part2/
。我仍然想要第2部分之前的所有内容。我希望避免这个索引,但看起来没有其他东西像它那样可靠。thanks@geneb. 不客气。我已经编辑了我的答案。可能是第二个aproach稍短。谢谢,但是这些字符串与最后一段不匹配<代码>http://myapp-dev.host.com/app/,
http://app.host.com:8080/app/app2
^https?:\/\/\w+(:[0-9]*)?(\.\w+)?
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;
}