Inhalt eines Strings um eins hochzählen

MrWhoopy

Mitglied
Hi,

ich habe folgendes Problem:

Ich habe einen bestimmten String der ungefähr so ausschaut: "Testlog-2011-11-07-1.log". Von der Länge her ist er immer gleich. Jetzt möchte ich aber in einer Schleife die letzte Endung (in diesem Fall die "1" ) hochzählen könnnen, also "Testlog-2011-11-07-2.log" und "Testlog-2011-11-07-3.log" usw.

Mit indexOf komm ich genau zur richtigen Stelle aber wie les ich so den Inhalt aus, dass ich ihn anschließend hochzählen kann?

Würde mich sehr über Hilfe freuen 🙂

Lg

MrWhoopy
 
Mit indexOf wirds doch schon schwierig, wenn du auf Zehner kommst oder nicht? Oder soll nach ..9 wieder ...1 kommen? Doch eher ...10

Du kannst grundsätzlich mit Integer.parseInt(String s) String in ints umwandeln un d mit String.valueOf(..) wieder zurück in int.

edit
 
Zuletzt bearbeitet:
Wenn du willst, gehts - wie des öfteren - mit etwas Regex Magie 😉
Java:
String inputPart = input.replaceFirst("^.*?(\\-\\d+){3}\\-(\\d+)", "$1");
int value = Integer.parseInt(inputPart) + 1;
Wenn du allerdings einfach ein neues File - welches noch nicht existiert - erstellen willst, dann lauf so lange durch die Dateinamen (mit 1 beginnend), bis dein erstelltes File nicht existiert.
 
Ah das klingt schonmal gut^^

Aber irgendwie klappt das nicht so ganz,

Java:
last = rs_1.getString(1);
Integer.parseString(last);

"last" hab ich als String deklariert. Und mit dem getString(1) hol ich mir einen Eintrag aus einer DB. Wenn ich jetzt aber Integer.parseString(last) ausführen will heißt es "the method is undefined for the type integer" ?!
 
Hmm sorry irgendwie hab ich glaub grad n Brett vorm Kopf ???:L

Java:
rs_1.next();
String last;
last = rs_1.getString(1);
Integer.parseInt(last);
last = last + 1;
System.out.println(last);

Ich bekomm dauernd tolle Fehler! Ich will ja von meinem String nur die letzte Zahl vor dem .log um eins erhöhen. Aber ich bekomms grad echt nicht hin.

Damit hab ichs auch probiert:

Java:
last = rs_1.getString(1);
String last_1;
last_1 = ""+(Integer.parseInt(last) + 1);
System.out.println(last_1);
 
Zuletzt bearbeitet:
Was bekommst du für Fehler?
Wie schaut der String last aus?

Ohne Fehlermeldungen kann man dir schlecht helfen...
 
Java:
rs_1.next();
String last = rs_1.getString(1);
int i = Integer.parseInt(last);
i += 1;
System.out.println(i);
... du solltest dir aber zuerst Mal ein Anfängerbuch zulegen.
 
Java:
String inputPart = input.replaceFirst("^.*?(\\-\\d+){3}\\-(\\d+)", "$1");
int value = Integer.parseInt(inputPart) + 1;

Räusper -
Code:
String input = "Testlog-2011-11-07-1.log";

Code:
Exception in thread "main" java.lang.NumberFormatException: For input string: "-07.log"
	at java.lang.NumberFormatException.forInputString(Unknown Source)

Da ist wohl zuviel unverständliche Magie drin ...

Ich wollte den String mit
Code:
input.split("-|.")
in die Teile auftrennen um den danach wieder zusammenzubauen aber der . geht nicht
 
Ups, da hab ich mich ganz vertan. Da sieht man, dass ich den Code gar nicht mehr teste, welchen ich poste 😳
Natürlich muss erstens Gruppe 2 und nicht Gruppe 1 selektiert werden (bin mir gewöhnt, dass diese einfachen Regex sozusagen nie Groups haben, da kann ich also meistens [c]$1[/c] nehmen), und der Matcher muss auch bis ans Stringende kommen. Also so:
Java:
replaceFirst("^.*?(\\-\\d+){3}\\-(\\d+).*$", "$2")
 
So, das Ganze konventionell ohne Magie 😉
Möglicherweise anfängertauglicher

Java:
		String filename = "Testlog-2011-11-07-1.log";
		System.out.println(filename);
		int from = filename.lastIndexOf("-") + 1;
		int to = filename.indexOf(".");
		int nr = Integer.parseInt(filename.substring(from, to));
		filename = filename.substring(0, from) + (nr+1) + ".log";
		System.out.println(filename);

Da könnte man theoretisch auch auf eine Zeile schreiben, dann wärs ähnlich kompliziert wie regex 😀
 
Zuletzt bearbeitet:
Ich hätte sowas:

Java:
public static void main(String[] args) {
		String start = "Testlog-2011-11-07-134.log";
		System.out.println(start);
		Pattern pattern = Pattern.compile(".*?(\\d+)(-)?.log");
		Matcher matcher = pattern.matcher(start);
		if(matcher.find()){
			String intS = matcher.group(1);
			int i = Integer.parseInt(intS);
			String output = start.substring(0, start.indexOf(intS));
			output = output + (++i) + ".log";
			System.out.println(output);
		}
	}

edit
 
Zuletzt bearbeitet:
Nur weil du resistent gegen alle Regextutorials bist :bae: ok ok wird schon wieder OT...
Regex ist extrem schwierig zu verstehen (ich kenn regular expressions schon länger als es Java gibt! All die shells, sed ... jede Applikation hat eine andere Notation) Aus Überlegungen zur Wartbarkeit rate ich dringend davon ab, wenn es nicht ZWINGENDE Gründe gibt regex einzusetzen

Was meinst du - ich hab wirklich danach gesucht warum filename.split("-|."); nicht geht
split"-" tut, split "." nicht - ???:L

Das erachte ich nicht mehr als OT - das gäbe eine weitere Lösungsmöglichkeit die Ziffer zu isolieren.
 
Weil .split(Regex) ein Regex erwartet. Der Punkt ist ein Sonderzeichen und will maskiert werden.

Java:
"Testlog-2011-11-07-123.log".split("\\.");

ergibt dann ein Array mit 2 Einträgen "Testlog-2011-11-07-123" und "log"
 
Im Zweifelsfall lieber mehr als weniger escapen. Ein [c]split("\\-|\\.")[/c] wird sicher funktionieren. Ein [c]split("-|\\.")[/c] warscheinlich auch. Ein [c]split("[-.]")[/c] wohl auch, und wer auf Nummer sicher gehen will von mir aus auch ein [c]split("[\\-\\.]")[/c] wobei letzteres (Die Escapezeichen in [c]\\.[c]) in Aufzählungen unnötig ist.
 
Ich wollte den String mit
Code:
input.split("-|.")
in die Teile auftrennen um den danach wieder zusammenzubauen aber der . geht nicht

Probiere mal
Code:
input.split("-|\\.")

Java:
 ... 
		Pattern pattern = Pattern.compile(".*?(\\d+)(-)?.log");

Das funktioniert zwar "zufällig", aber besser wäre auch hier [c]".*?(\\d+)(-)?\\.log"[/c].

Natürlich muss erstens Gruppe 2 und nicht Gruppe 1 selektiert werden

Falls dich die erste Gruppe nicht interessiert, kannst du sie auch gruppieren, ohne sie zu speichern. Nämlich per [c](?: ... )[/c]
 
Zuletzt bearbeitet:
Danke für deinen Hinweis. Aber ist dann diese Gruppe nicht auch non-captured im gesamten Regex, d.h. dieser Teil des Strings bleibt bestehen? Hab ich immer so interpretiert...

Ich würde bei der Split-Variante eindeutig zu [c][-.][/c] tendieren.
 

Neue Themen


Zurück
Oben