String in Java von hinten abschneiden?
Hallo,
ich habe folgenden Dateipfad:
/var/opt/prog/prog-data/repo/xyz-test/test.git
Alles was vor oder nach repo ist sieht immer unterschiedlich aus.
kann zum Beispiel auch repo/bcd-test/test.test.test.git sein
Ich benötige den hinteren Teil ab repo:
repo/xyz-test/test.git
wie geht das mit Java? wie könnte ich also den String so abschneiden?
5 Antworten
Hey,
Regex geht, alles an den Slashes splitten geht.
Aber in deinem Fall würde ich es mir einfach machen und einfach String.lastIndexOf benutzen, das liefert dir die letzte Position eines Vorkommens im String:
String myStr = "Hello planet earth, you are a great planet.";
System.out.println(myStr.lastIndexOf("planet"));
https://www.w3schools.com/java/ref_string_lastindexof.asp
Das kombinierst Du einfach mit String.substring
So ungefähr:
String input = "/var/opt/prog/prog-data/repo/xyz-test/test.git";
int indexOfRepo = input.lastIndexOf("repo");
String subPath = input.substring(indexOfRepo);
Je nach use case kann es aber auch lohnen den Pfad wirklich als Path-Objekt zu nutzen wie das auch vorgeschlagen wurde. Kommt wirklich drauf an was Du brauchst, welche Prüfung Du noch so vor hast :)
Viel Erfolg
Gruß
Auf jeden Fall ist das nicht sicher.
Aber wenn man in einem Umfeld ist in dem man sich solche Dinge sowieso nicht leisten kann, dann würde ich gleich Path benutzen, statt mit Strings rumzumachen.
Es kommt wirklich auf den konkreten Fall an was man machen möchte.
Gruß
Ich vermute mal du willst das in einem Pfad umwandeln und dann damit arbeiten.
Path path = Path.of(path_str);
Dann kannst du den relativen Pfad mittels der passenden Methode erzeugen:
Path relative_path = path_parent.relativize(path);
path_parent ist dabei der Pfad nach "/var/opt/prog/prog-data/repo".
Vorteil von dieser Variante sind eingebaute Syntaxchecks, leichte Möglichkeit, komplexere Pfade aufzulösen und bereits eingebaute hilfreiche Methoden.
Siehe auch:
https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/nio/file/Path.html
Du kannst entweder einen substring ab einem bestimmten index "ausschneiden" oder den ersten Teil mit der "replace" methode durch einen leeren String ersetzen.
- substring
public static String repoPath(String in) {
return in.substring(24); // gibt den Teil des Strings
// ab index 24 (das 'r' in
// "repo") zurück
}
- replace
public static String repoPath(String in) {
return in.replace("/var/opt/prog/prog-data/", "");
}
Die erste Methode ist weit effizienter, die zweite eventuell Nutzerfreundlicher, du musst keinen Index abzählen (was ich ja eh schon für dich gemacht habe). ich würde die erste Methode verwenden.
Das wird leider nicht klappen da alles was vor repo ist kann auch anderes aussehen. nur repo bleibt erhalten
Oh verstehe. Entschuldigung, ich habe überlesen, dass auch das vor repo anders sein kann. In diesem Falle verweise ich auf die Antwort des/der Destranix bzw. auf in.split("repo", 2), falls du sicher sein kannst, dass "repo" nicht vorher ungewollt in dem Pfad vorkommt.
Abschneiden machst du mit Substring.
String.split war das glaube ich. Oder du verwendest eine Regex.
mit String.split splittest du den String in viele einzelne Teile.
string[] arr = "h.a.l.l.o".split('.');
arr = {"h","a","l","l","o"}
Abschneiden machst du mit substring
string tmp = "hallo".substring(0,2);
tmp = "ha" könnte auch "hal" sein, bin ich mir gerade nicht sicher.
Klappt bei mir nicht:
Ich würde den Pfad mit input.split("/repo/") zerlegen und einen Fehler werfen, wenn dabei nicht exakt zwei Teile entstehen.