Как получить последний сегмент пути URI - PullRequest
95 голосов
/ 29 октября 2010

У меня на входе строка, которая 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();

но это не работает, и наверняка есть лучший способ сделать это.

Ответы [ 11 ]

146 голосов
/ 29 октября 2010

- это то, что вы ищете:

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);
58 голосов
/ 19 февраля 2015
import android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();
47 голосов
/ 29 октября 2010

Вот короткий способ сделать это:

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
21 голосов
/ 06 мая 2015

Я знаю, что это старо, но решения здесь кажутся довольно многословными. Просто легко читаемый однострочный, если у вас есть URL или URI:

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

Или, если у вас есть String:

String filename = new File(new URL(url).getPath()).getName();
8 голосов
/ 05 августа 2016

Если вы используете 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);
7 голосов
/ 13 декабря 2016

В 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 голосов
/ 02 марта 2018

В Android

Android имеет встроенный класс для управления URI.

Uri uri = Uri.parse("http://base_path/some_segment/id");
String lastPathSegment = uri.getLastPathSegment()
3 голосов
/ 04 августа 2017

Вы можете использовать функцию 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.

2 голосов
/ 03 ноября 2016

Если у вас есть commons-io, включенный в ваш проект, вы можете сделать это без создания ненужных объектов с помощью org.apache.commons.io.FilenameUtils

String uri = "http://base_path/some_segment/id";
String fileName = FilenameUtils.getName(uri);
System.out.println(fileName);

. Даст вам последнюю часть пути, то есть * 1006.*

0 голосов
/ 09 ноября 2018

Я использую следующее в служебном классе:

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...