[java] URI의 마지막 경로 세그먼트를 얻는 방법

입력으로 URI. 마지막 경로 세그먼트 (내 경우에는 ID)를 어떻게 얻을 수 있습니까?

이것은 내 입력 URL입니다.

String uri = "http://base_path/some_segment/id"

그리고 나는 이것으로 시도한 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);


답변

import android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();


답변

이를 수행하는 간단한 방법은 다음과 같습니다.

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

설명:

.*/      // 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:

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


답변

Java 8을 사용 중이고 파일 경로의 마지막 세그먼트를 원하는 경우 수행 할 수 있습니다.

Path path = Paths.get("example/path/to/file");
String lastSegment = path.getFileName().toString();

당신이 http://base_path/some_segment/id할 수있는 것과 같은 URL이 있다면 .

final Path urlPath = Paths.get("http://base_path/some_segment/id");
final Path lastSegment = urlPath.getName(urlPath.getNameCount() - 1);


답변

Android에서

Android에는 URI 관리를위한 기본 제공 클래스가 있습니다.

Uri uri = Uri.parse("http://base_path/some_segment/id");
String lastPathSegment = uri.getLastPathSegment()


답변

Java 7+에서는 이전 답변 중 몇 가지를 결합 하여 마지막 세그먼트가 아닌 URI에서 모든 경로 세그먼트를 검색 할 수 있습니다 . 메서드를 java.nio.file.Path활용하기 위해 URI를 객체 로 변환 할 수 있습니다 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()하면 마지막에서 세 번째 세그먼트를 검색합니다.