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

Java 如何获取URI的最后一个路径段,java,string,url,Java,String,Url,我有一个URI字符串作为输入。如何获取最后一个路径段(在我的例子中是一个id) 这是我的输入URL: String uri = "http://base_path/some_segment/id" 我必须获得我尝试过的身份证: String strId = "http://base_path/some_segment/id"; strId = strId.replace(path); strId = strId.replaceAll("/&qu

我有一个
URI
字符串作为输入。如何获取最后一个路径段(在我的例子中是一个id)

这是我的输入URL:

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

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

这就是你想要的:

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");
}
输出:

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

我知道这是老生常谈,但这里的解决方案似乎相当冗长。如果您有
URL
URI
,则只需一行代码即可轻松阅读:

String filename = new File(url.getPath()).getName();
或者如果您有一个
字符串

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

如果您使用的是Java8,并且希望文件路径中的最后一段,那么您可以这样做

Path path = Paths.get("example/path/to/file");
String lastSegment = path.getFileName().toString();
final Path urlPath = Paths.get("http://base_path/some_segment/id");
final Path lastSegment = urlPath.getName(urlPath.getNameCount() - 1);
如果您有一个url,如
http://base_path/some_segment/id
您可以这样做

Path path = Paths.get("example/path/to/file");
String lastSegment = path.getFileName().toString();
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);

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

,可以组合前面的一些答案,以允许从URI检索任何路径段,而不仅仅是最后一段。我们可以将URI转换为对象,以利用其方法

不幸的是,静态工厂
path.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();
要获得一行代码中的最后一段,只需将上面的行嵌套即可

path.get(URI.create(“http://base_path/some_segment/id“”.getPath()).getFileName().toString()

要获得倒数第二个段,同时避免索引编号和可能出现的“一对一”错误,请使用以下方法

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);
List pathSegments=uri.getPathSegments();
字符串lastSegment=pathSegments.get(pathSegments.size-1);

lastSegment
将是Android中的
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


不起作用,请参阅getFile()的javadoc:获取此URL的文件名。返回的文件部分将与getPath()相同,加上getQuery()值的串联(如果有)。如果没有查询部分,这个方法和getPath()将返回相同的结果。)使用
getPath()
而不是
getFile()
。我在搜索Android的Android.net.Uri(不是java.net.Uri)并在这里结束。如果您使用该方法,则其中有一个名为getLastPathSegment()的方法,该方法应执行相同的操作。:)只需执行
String idStr=new File(uri.getPath()).getName()
,与此答案相同,但使用
File
而不是
String
来分割路径。这不适用于类似URL的URL。最后一个“/”是制造麻烦。需要一些更好的getLastPathSegment()由@paul_sns给出的答案是完美的。@VaibhavKadam好吧,从技术上讲,你可以说最后一段是一个空字符串。但如果这不是您想要的,只需使用:
while(path.endsWith(“/”)path=path.substring(0,path.length()-1)@sfussenger我的坏消息我没有读到有问题的标签。我以为它有安卓的标签。android.net.uri为+1.:)。Android正在接管JAVA。这是“Android.net.Uri”吗?根据问题的标记,假设java.net.URI没有getLastPathSegment()……而且,Android
URI
类名是小写的,无法实例化。我已更正您的答案,使用静态工厂方法
Uri.parse()
。此处不存在GetLastPathSegment。它确实有GetLastPathSegment(),但不起作用!返回空值!似乎getLastPathSegment()为我随机地给出了完整的路径。虽然我是regex的忠实粉丝,而且我自己也经常使用它,但我认识到对于大多数开发人员来说,regex是最迟钝的。它并不简单,因为它不容易理解。求反字符类
[^/?]
中的
/
是不必要的,因为它永远不会匹配
*/
将始终匹配字符串中的最后一个
/
,因此不应遇到其他
/
。不适用于此类链接
http://example.com/foo#reply2
,如果您能更新您的答案来解决它,那就太好了。Thanks@Seth我自己刚试过;如果将正则表达式更新为
([^/?]+)
而不是
([^/?]+)
,则应该可以工作。风险很大,因为java.nio.file.path#get依赖于JVM运行的OS文件系统。不能保证它会将带有正斜杠的URI识别为路径分隔符。那么带有查询参数的URI呢?将随机URI视为文件系统路径会引发异常。它是否适用于URL的所有可能选项,如
a.co/last?a=1 35; frag
。我认为不会,因为代码会在最后一个路径符号的子字符串结束之前执行:
path.substring(index+1)
@alik问题询问最后一个路径段。查询和片段不是路径段的一部分。有时这只是吐出完整的路径。不知道为什么或者什么时候它看起来是随机的。如果你能捕捉到它正在解析的内容,也许你可以设置一个单元测试来进行测试