wake-up-neo.net

So erhalten Sie das letzte Pfadsegment eines URI

Ich habe eine Zeichenfolge eingegeben, die URI ist. Wie kann man das letzte Pfadsegment erhalten? das in meinem Fall eine id ist?

Dies ist meine Eingabe-URL 

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

Und ich muss das Id bekommen, das ich damit versucht habe

String strId = "http://base_path/some_segment/id";
strId=strId.replace(path);
strId=strId.replaceAll("/", "");
Integer id =  new Integer(strId);
return id.intValue();

aber es funktioniert nicht und mit Sicherheit gibt es einen besseren Weg.

88
DX89B

ist das, wonach Sie suchen:

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);

alternative

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);
139
sfussenegger
import Android.net.Uri;
Uri uri = Uri.parse("http://example.com/foo/bar/42?param=true");
String token = uri.getLastPathSegment();
55
Colateral

Hier ist eine kurze Methode, dies zu tun:

public static String getLastBitFromUrl(final String url){
    // return url.replaceFirst("[^?]*/(.*?)(?:\\?.*)","$1);" <-- incorrect
    return url.replaceFirst(".*/([^/?]+).*", "$1");
}

Testcode:

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/"));
}

Ausgabe:

42
foo
Bar

Erläuterung:

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

Ich weiß, das ist alt, aber die Lösungen hier wirken ziemlich wortreich. Nur ein leicht lesbarer Einzeiler, wenn Sie eine URL oder URI haben:

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

Oder wenn Sie eine String haben:

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

Wenn Sie Java 8 verwenden und das letzte Segment in einem Dateipfad verwenden möchten, können Sie dies tun.

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

Wenn Sie eine URL wie http://base_path/some_segment/id haben, können Sie dies tun.

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

In Java 7+ können einige der vorherigen Antworten kombiniert werden, um das Abrufen eines beliebigen Pfadsegments von einem URI zu ermöglichen Wir können den URI in ein Java.nio.file.Path - Objekt konvertieren, um dessen getName(int) -Methode zu nutzen .

Leider ist die statische Factory Paths.get(uri) nicht für die Verarbeitung des http-Schemas ausgelegt, daher müssen wir zuerst das Schema vom Pfad des URI trennen.

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();

Verschachteln Sie einfach die obigen Zeilen, um das letzte Segment in einer Codezeile zu erhalten.

Paths.get(URI.create("http://base_path/some_segment/id").getPath()).getFileName().toString()

Verwenden Sie die getParent() -Methode, um das vorletzte Segment abzurufen und dabei Indexnummern und die Möglichkeit von Fehlern zu vermeiden.

String secondToLast = path.getParent().getFileName().toString();

Beachten Sie, dass die getParent() -Methode wiederholt aufgerufen werden kann, um Segmente in umgekehrter Reihenfolge abzurufen. In diesem Beispiel enthält der Pfad nur zwei Segmente. Andernfalls würde der Aufruf von getParent().getParent() das vorletzte Segment abrufen.

7
jaco0646

In Android

Android verfügt über eine integrierte Klasse zum Verwalten von URIs.

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

Sie können die Funktion getPathSegments() verwenden. ( Android Dokumentation )

Betrachten Sie Ihren Beispiel-URI:

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

Sie können das letzte Segment abrufen mit:

List<String> pathSegments = uri.getPathSegments();
String lastSegment = pathSegments.get(pathSegments.size - 1);

lastSegment wird id sein.

3
Sina Masnadi

Wenn Sie commons-io in Ihr Projekt aufgenommen haben, können Sie dies tun, ohne unnötige Objekte mit org.Apache.commons.io.FilenameUtils zu erstellen.

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

Gibt dir den letzten Teil des Pfades, der id ist

2
Bnrdo

Ich verwende Folgendes in einer Utility-Klasse:

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();
}
0
Gerold Broser