Java: obtenir une sous-chaîne à partir d'une chaîne commençant après un caractère particulier


196

J'ai une chaîne:

/abc/def/ghfj.doc

Je voudrais en extraire ghfj.doc, c'est-à-dire la sous-chaîne après la dernière /, ou la première /de droite.

Quelqu'un pourrait-il fournir de l'aide?


39
regardez, je comprends la valeur de la recherche de la réponse vous-même avant de poser des questions, mais le fait est que cette question a rendu ma recherche beaucoup plus facile .. exactement ce que je voulais après le premier coup. Plus rapide que de consulter des javadocs. C'est bien que cette question soit là. Pourquoi les downvotes?
Eric

3
Bien que cela soit quelque peu différent de votre question d'origine: dans votre exemple, org.apache.commons.io.FilenameUtils.getBaseName est beaucoup plus fiable que de faire vos propres opérations de chaîne.
Jusqu'à Schäfer

4
@Eric Je suis entièrement d'accord avec votre commentaire, car c'était le premier résultat Google pour ma question et la réponse acceptée est exactement ce que je devais utiliser.
thonnor

Réponses:



42

Une implémentation très simple avec String.split():

String path = "/abc/def/ghfj.doc";
// Split path into segments
String segments[] = path.split("/");
// Grab the last segment
String document = segments[segments.length - 1];

1
ce code générera une erreur Array Index Out of Bounds si le séparateur n'est pas trouvé.
Patrick Parker

36

qu'as-tu essayé? c'est très simple:

String s = "/abc/def/ghfj.doc";
s.substring(s.lastIndexOf("/") + 1)

23

Une autre façon est d'utiliser ce .

String path = "/abc/def/ghfj.doc"
String fileName = StringUtils.substringAfterLast(path, "/");

Si vous passez null à cette méthode, elle renverra null. S'il n'y a pas de correspondance avec le séparateur, il retournera une chaîne vide.


1
Enfin quelque chose de vraiment pratique, ne connaissait pas cette méthode. Je déteste tracasser avec substring + indexof + 1 - 2 +3 que ce soit. C'est beaucoup plus propre :)
BAERUS

Si vous souhaitez utiliser cette méthode sur Android, vous devez importer la StringUtilsbibliothèque, cette réponse montre chaud pour le faire: stackoverflow.com/a/33935645/2966583
stramin

9

Vous pouvez utiliser Apache commons:

Pour la sous-chaîne après la dernière occurrence, utilisez cette méthode.

Et pour la sous-chaîne après la première occurrence, la méthode équivalente est ici .


4

Cela peut également obtenir le nom de fichier

import java.nio.file.Paths;
import java.nio.file.Path;
Path path = Paths.get("/abc/def/ghfj.doc");
System.out.println(path.getFileName().toString());

Imprime ghfj.doc



1

Dans Kotlin, vous pouvez utiliser substringAfterLast, en spécifiant un délimiteur.

val string = "/abc/def/ghfj.doc"
val result = url.substringAfterLast("/")
println(result)
// It will show ghfj.doc

Du doc :

Renvoie une sous-chaîne après la dernière occurrence du délimiteur. Si la chaîne ne contient pas le délimiteur, retourne missingDelimiterValue qui correspond par défaut à la chaîne d'origine.


0

Je pense que ce serait mieux si nous utilisons directement la fonction split

String toSplit = "/abc/def/ghfj.doc";

String result[] = toSplit.split("/");

String returnValue = result[result.length - 1]; //equals "ghfj.doc"

ce code générera une erreur si le séparateur n'est pas trouvé.
Patrick Parker

@PatrickParker Pourquoi avez-vous commenté partout qu'il lancerait une erreur si le séparateur n'était pas trouvé. Si vous le faites à des fins de connaissances, d'accord, mais je pense juste que c'est un peu trop peut-être ...
Gaurav Mall

@GauravMall J'aide les gens à améliorer leurs réponses, à écrire un meilleur code et à ceux qui le visitent pour les aider à éviter les pièges et à mieux comprendre le code avant de le coller quelque part. Je supprimerai volontiers mon commentaire une fois la réponse améliorée. De plus, l'écrire à deux endroits n'est guère «partout». Enfin, la section des commentaires n'est pas destinée à une méta-discussion.
Patrick Parker
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.