如何获取uri的最后一个路径段

时间:2010-10-29 08:05:27

标签: java string url

我输入了一个URI的字符串。怎么可能得到最后一个路径段? 在我的情况下是一个id?

这是我输入的网址

String uri = "http://base_path/some_segment/id"

我必须获得我用这个

尝试的身份证
String strId = "http://base_path/some_segment/id";
strId=strId.replace(path);
strId=strId.replaceAll("/", "");
Integer id =  new Integer(strId);
return id.intValue();

但它不起作用,肯定有更好的方法。

12 个答案:

答案 0 :(得分:144)

是你在找什么:

URI uri = new URI("http://example.com/foo/bar/42?param=true");
String path = uri.getPath();
String idStr = path.substring(path.lastIndexOf('/') + 1);
int id = Integer.parseInt(idStr);

替代地

URI uri = new URI("http://example.com/foo/bar/42?param=true");
String[] segments = uri.getPath().split("/");
String idStr = segments[segments.length-1];
int id = Integer.parseInt(idStr);

答案 1 :(得分:57)

import android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();

答案 2 :(得分:46)

这是一个简短的方法:

public static String getLastBitFromUrl(final String url){
    // return url.replaceFirst("[^?]*/(.*?)(?:\\?.*)","$1);" <-- incorrect
    return url.replaceFirst(".*/([^/?]+).*", "$1");
}

测试代码:

public static void main(final String[] args){
    System.out.println(getLastBitFromUrl(
        "http://example.com/foo/bar/42?param=true"));
    System.out.println(getLastBitFromUrl("http://example.com/foo"));
    System.out.println(getLastBitFromUrl("http://example.com/bar/"));
}

输出:

  

42
  FOO
  杆

说明:

.*/      // find anything up to the last / character
([^/?]+) // find (and capture) all following characters up to the next / or ?
         // the + makes sure that at least 1 character is matched
.*       // find all following characters


$1       // this variable references the saved second group from above
         // I.e. the entire string is replaces with just the portion
         // captured by the parentheses above

答案 3 :(得分:18)

我知道这是旧的,但这里的解决方案似乎相当冗长。如果您有URLURI

,那么这只是一个易于理解的单行内容
String filename = new File(url.getPath()).getName();

或者如果您有String

String filename = new File(new URL(url).getPath()).getName();

答案 4 :(得分:7)

如果您使用的是Java 8,并且想要文件路径中的最后一段,则可以这样做。

Path path = Paths.get("example/path/to/file");
String lastSegment = path.getFileName().toString();

如果您有http://base_path/some_segment/id这样的网址,则可以这样做。

final Path urlPath = Paths.get("http://base_path/some_segment/id");
final Path lastSegment = urlPath.getName(urlPath.getNameCount() - 1);

答案 5 :(得分:7)

在Java 7+中,可以将以前的一些答案组合起来,以便从URI中检索任何路径段,而不仅仅是最后一段。我们可以将URI转换为java.nio.file.Path对象,以利用其getName(int)方法。

不幸的是,静态工厂Paths.get(uri)不是为了处理http方案而构建的,所以我们首先需要将方案与URI的路径分开。

URI uri = URI.create("http://base_path/some_segment/id");
Path path = Paths.get(uri.getPath());
String last = path.getFileName().toString();
String secondToLast = path.getName(path.getNameCount() - 2).toString();

要获取一行代码中的最后一段,只需将上面的行嵌套。

Paths.get(URI.create("http://base_path/some_segment/id").getPath()).getFileName().toString()

要获得倒数第二段,同时避免使用索引编号和可能出现的逐个错误,请使用getParent()方法。

String secondToLast = path.getParent().getFileName().toString();

注意,可以重复调用getParent()方法以按相反顺序检索段。在此示例中,路径仅包含两个段,否则调用getParent().getParent()将检索倒数第三个段。

答案 6 :(得分:6)

在Android中

Android有一个用于管理URI的内置类。

Uri uri = Uri.parse("http://base_path/some_segment/id");
String lastPathSegment = uri.getLastPathSegment()

答案 7 :(得分:3)

您可以使用getPathSegments()功能。 (Android Documentation

考虑您的示例URI:

String uri = "http://base_path/some_segment/id"

您可以使用以下方式获取最后一段:

List<String> pathSegments = uri.getPathSegments();
String lastSegment = pathSegments.get(pathSegments.size - 1);

lastSegment将为id

答案 8 :(得分:2)

如果项目中包含commons-io,则可以在不使用org.apache.commons.io.FilenameUtils

创建不必要的对象的情况下执行此操作
String uri = "http://base_path/some_segment/id";
String fileName = FilenameUtils.getName(uri);
System.out.println(fileName);

将为您提供路径的最后一部分,即id

答案 9 :(得分:2)

您还可以使用replaceAll:

String uri = "http://base_path/some_segment/id"
String lastSegment = uri.replaceAll(".*/", "")

System.out.println(lastSegment);

结果:

id

答案 10 :(得分:0)

我在实用程序类中使用以下内容:

public static String lastNUriPathPartsOf(final String uri, final int n, final String... ellipsis)
  throws URISyntaxException {
    return lastNUriPathPartsOf(new URI(uri), n, ellipsis);
}

public static String lastNUriPathPartsOf(final URI uri, final int n, final String... ellipsis) {
    return uri.toString().contains("/")
        ? (ellipsis.length == 0 ? "..." : ellipsis[0])
          + uri.toString().substring(StringUtils.lastOrdinalIndexOf(uri.toString(), "/", n))
        : uri.toString();
}

答案 11 :(得分:-1)

如果您还没准备好使用子字符串提取文件的方式,请从URI获取URL并使用getFile()。