Supposons que j'ai la chaîne
output = path.substring(0, path.lastIndexOf("/", 1));
Je voudrais la sortie suivante
String output = "the/quick/brown/fox/jumped/over/the/lazy/";
Je pensais que ce qui suit ferait l'affaire p>
String path = "the/quick/brown/fox/jumped/over/the/lazy/dog/";
étant donné ce que dit le document
Renvoie l'index de la première (dernière) occurrence du caractère spécifié, en recherchant en avant (en arrière) à partir de l'index spécifié.
mais cela ne semble pas fonctionner.
Toute aide serait appréciée.
8 Réponses :
Le deuxième paramètre de la méthode lastIndexOf spécifie le maximum index jusqu'à l'endroit où la méthode doit rechercher la chaîne. Cela signifie que dans votre cas,
path.lastIndexOf("/", 1)
renvoie le premier index de "/" dont l'index est inférieur à 1.
Oui, j'ai le problème maintenant. Merci pour l'aide.
Tout d'abord, lastIndexOf renverra un index, pas une chaîne. Il recherche également en arrière à partir de l'index spécifié 1 , donc il ne regardera que tout avant et y compris le caractère à l'index 1. Cela signifie que il ne vérifie que t et h . Comme prévu, il ne trouve rien et renvoie -1.
Vous devez simplement omettre le deuxième argument si vous souhaitez rechercher toute la chaîne.
De plus, pour obtenir la chaîne de sortie souhaitée (je suppose que vous voulez le dernier composant de chemin supprimé?), vous pouvez utiliser replaceAll avec une expression régulière:
String output = path.replaceAll("[^/]+/$", "");
Merci pour l'explication. Je pense que vous avez raison - regex est le meilleur moyen de gérer cela. BTW, je ne vous ai pas contre.
Utilisation d'Apache Commons IO
public static String removeLastPart(String str) {
int pos = str.length() - 1;
while (str.charAt(pos) != '/' || pos + 1 == str.length()) {
pos--;
}
return str.substring(0, pos + 1);
}
Ne pas utiliser Apache
String output = org.apache.commons.io.FilenameUtils.getPath(path);
Cela fonctionne, étant donné le chemin longueur> 2
final String path = "the/quick/brown/fox/jumped/over/the/lazy/dog/";
final int secondLast = path.length()-2;
final String output = path.substring(0, path.lastIndexOf("/",secondLast)+1);
System.out.println(output);
Il semble que chaque réponse suppose que vous connaissez déjà la chaîne d'entrée et la position exacte de la dernière occurrence de "/" , alors que ce n'est généralement pas le cas ...
Voici une méthode plus générale pour obtenir le nième-dernier (deuxième-dernier, troisième-dernier, etc.) occurrence d'un caractère à l'intérieur d'une chaîne:
String s = "the/quick/brown/fox/jumped/over/the/lazy/dog/";
System.out.println(s.substring(0, nthLastIndexOf(2, "/", s)+1)); // substring up to 2nd last included
System.out.println(s.substring(0, nthLastIndexOf(3, "/", s)+1)); // up to 3rd last inc.
System.out.println(s.substring(0, nthLastIndexOf(7, "/", s)+1)); // 7th last inc.
System.out.println(s.substring(0, nthLastIndexOf(2, "/", s))); // 2nd last, char itself excluded
Utilisation :
static int nthLastIndexOf(int nth, String ch, String string) {
if (nth <= 0) return string.length();
return nthLastIndexOf(--nth, ch, string.substring(0, string.lastIndexOf(ch)));
}
Sortie:
le / rapide / brun / renard / a sauté / par-dessus / le / paresseux /
le / rapide / brun / renard / a sauté / par-dessus / le /
le / rapide / marron /
le / rapide / brun / renard / a sauté / par-dessus / le / paresseux
Je sauverai certainement cela. Très souple.
Si vous avez affaire à des chemins et des fichiers, pourquoi ne pas utiliser les classes intégrées? Quelque chose comme ci-dessous me semble plus facile que la manipulation de chaînes:
Path path = Paths.get("the/quick/brown/fox/jumped/over/the/lazy/dog/");
System.out.println(path.getParent());
// prints: the\quick\brown\fox\jumped\over\the\lazy
System.out.println(path.getParent().getParent());
// prints: the\quick\brown\fox\jumped\over\the
Par exemple, String key = "aaa / bbb / ccc / ddd";
et j'ai besoin de ma chaîne de résultat comme "ccc / ddd". qui est, sous-chaîne de l'avant-dernier index de "/", Le code suivant aide:
String key="aaa/bbb/ccc/ddd";
key=key.substring(key.substring(0, key.lastIndexOf("/")).lastIndexOf("/")+1);
La valeur finale de la clé sera "ccc / ddd".
Voici un cas d'utilisation:
21 /app/getPTVars
et la sortie:
String url = "http://localhost:4000/app/getPTVars";
int secondLastIndexOf = url.substring(0, url.lastIndexOf('/')).lastIndexOf('/');
System.out.println(secondLastIndexOf);
System.out.println(url.substring(secondLastIndexOf, url.length()));
Qu'est-ce qui ne fonctionne pas exactement? Nous avons besoin de plus d'informations.
Il semble scanner depuis le début, pas la fin. Ainsi, la sortie est simplement
/.Comme indiqué dans les docs. La méthode renvoie uniquement la valeur d'index et non une chaîne
^ C'était une faute de frappe
N'oubliez pas qu'avec la
sous-chaîne (début, fin)crée une sous-chaîne dudébutà, mais sans inclure l'indexend. Donc, si vous voulez le dernier/dans votre chaîne de sortie, ajoutez simplement +1 à votrefin