我输入了一个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();
但它不起作用,肯定有更好的方法。
答案 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)
我知道这是旧的,但这里的解决方案似乎相当冗长。如果您有URL
或URI
:
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()。