web-dev-qa-db-fra.com

Comment obtenir le dernier segment de chemin d'un uri

J'ai en entrée une chaîne qui est une URI. comment est-il possible d'obtenir le dernier segment de chemin? que dans mon cas est un identifiant?

Ceci est mon URL d'entrée 

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

Et je dois obtenir l'identifiant que j'ai essayé avec ceci

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

mais cela ne fonctionne pas et pour sûr, il existe un meilleur moyen de le faire.

88
DX89B

est-ce ce que vous recherchez:

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

alternativement

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

Voici une méthode courte pour le faire:

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

Code de test:

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

Sortie:

42
foo
bar

Explication:

.*/      // 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
Sean Patrick Floyd

Je sais que c'est vieux, mais les solutions ici semblent plutôt verbeuses. Juste une ligne facile à lire si vous avez un URL ou un URI:

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

Ou si vous avez une String:

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

Si vous utilisez Java 8 et que vous voulez le dernier segment d’un chemin de fichier, vous pouvez le faire.

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

Si vous avez une URL telle que http://base_path/some_segment/id, vous pouvez le faire.

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

Sous Android

Android a une classe intégrée pour la gestion des URI.

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

Vous pouvez utiliser la fonction getPathSegments(). ( Documentation Android )

Considérez votre exemple d'URI:

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

Vous pouvez obtenir le dernier segment en utilisant:

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

lastSegment sera id.

3
Sina Masnadi

Si commons-io est inclus dans votre projet, vous pouvez le faire sans créer d'objets inutiles avec org.Apache.commons.io.FilenameUtils

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

Vous donnera la dernière partie du chemin, qui est la id

2
Bnrdo

J'utilise les éléments suivants dans une classe d'utilitaire:

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