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