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?

Ensoleillé
la source
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:

310
    String example = "/abc/def/ghfj.doc";
    System.out.println(example.substring(example.lastIndexOf("/") + 1));
Sébastien Le Callonnec
la source
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];
Veger
la source
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)
vishal_aim
la source
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.

Alex Green
la source
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 .

Michal Przysucha
la source
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

pushya
la source
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.

Filipe Brito
la source
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"
user6317575
la source
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