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

我有一个字符串作为输入,它是 URI。怎样才能得到最后一个路径段(在我的例子中是一个 id) ?

这是我的输入地址:

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

我必须得到我试过的 ID:

String strId = "http://base_path/some_segment/id";
strId = strId.replace(path);
strId = strId.replaceAll("/", "");
Integer id =  new Integer(strId);
return id.intValue();

但它不起作用,而且肯定有更好的方法来做到这一点。

167939 次浏览

这就是你想要的:

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);

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

这里有一个简短的方法:

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

酒吧

说明:

.*/      // 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
import android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();

我知道这很老套,但这里的解决方案似乎相当冗长。如果你有一个 URL或者 URI,只是一个简单易读的一行程序:

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

或者如果你有 String:

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

如果您正在使用 Java8,并且希望在文件路径中执行最后一个段,则可以这样做。

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);

如果您的项目中包含了 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

在 Java7 + 中,可以组合前面的一些答案,以允许从 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()将检索倒数第三个段。

可以使用 getPathSegments()函数

考虑一下您的示例 URI:

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

你可以使用以下方法得到最后一个片段:

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

lastSegment就是 id

在安卓系统中

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

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

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

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();
}

也可以使用 replaceAll:

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


System.out.println(lastSegment);

结果:

id

可以从 Uri 类获得路径段列表

String id = Uri.tryParse("http://base_path/some_segment/id")?.pathSegments.last ?? "InValid URL";

如果 url 有效,它将返回 id; 如果 url 无效,它将返回“ Invalidurl”