Как получить последний сегмент пути uri
У меня на входе строка, которая является URI
. как можно получить последний отрезок пути?
что в моем случае является идентификатором?
Это мой входной 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();
но это не работает, и наверняка есть лучший способ сделать это.
Ответы
Ответ 1
- это то, что вы ищете:
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);
Ответ 2
import android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();
Ответ 3
Вот короткий способ сделать это:
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
Ответ 4
Я знаю, что это старо, но решения здесь кажутся довольно многословными. Просто читаемый однострочный, если у вас есть URL
или URI
:
String filename = new File(url.getPath()).getName();
Или, если у вас есть String
:
String filename = new File(new URL(url).getPath()).getName();
Ответ 5
Если вы используете Java 8 и хотите, чтобы последний сегмент находился в пути к файлу, вы можете сделать.
Path path = Paths.get("example/path/to/file");
String lastSegment = path.getFileName().toString();
Если у вас есть URL-адрес, например 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);
Ответ 6
В 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()
извлечет сегмент с третьего по последний.
Ответ 7
В Android
Android имеет встроенный класс для управления URI.
Uri uri = Uri.parse("http://base_path/some_segment/id");
String lastPathSegment = uri.getLastPathSegment()
Ответ 8
Вы можете использовать функцию getPathSegments()
. (Документация для Android)
Рассмотрим ваш пример URI:
String uri = "http://base_path/some_segment/id"
Вы можете получить последний сегмент, используя:
List<String> pathSegments = uri.getPathSegments();
String lastSegment = pathSegments.get(pathSegments.size - 1);
lastSegment
будет id
.
Ответ 9
Если у вас есть 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
Ответ 10
Я использую следующее в служебном классе:
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
Получите URL-адрес из URI и используйте getFile(), если вы не готовы использовать метод подстановки для извлечения файла.