Как получить последний сегмент пути 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(), если вы не готовы использовать метод подстановки для извлечения файла.