String Replace für JUnit

REC

Bekanntes Mitglied
Hallo zusammen,

Ich bin gerade mit einer Aufgabe beschäftigt. Es geht darum einen JUnit Test zu schreiben. Zuerst aber muss man mal die Primäreaufgabe lösen. Die besteht darin einen String "wert1=name1;wert2=name2;...etc" So Auseinander zu nehmen das diese 2 Werte in eine Hashmap gelegt werden können.
So zuerst einmal versuche ich, falls jemand aus versehen eine Leerstelle in den String eintippt, diesen rauszulöschen. Was ich bisher im Web zusammengetrage habe ist folgendes:

Java:
String textOhneLeerzeichen = text.replaceAll("\\s", "");

Leider habe ich keine Ahnung warum ich \\s scheriben muss? Wieso reicht nicht nur ein \? Ich weiss das es ein paar vordefinierte Befehel gibt, \w ,\d , etc. Aber die habe immer nur ein \ ?
 
Zuletzt bearbeitet:
Weil das ein RegEx ist. Du musst im RegEx
Code:
\s
eingeben. Da Java aber
Code:
\s
sonst als Steuerzeichen erkennen würde, musst du eben den Backslash eben escapen.
 
Ja klar soll doch \s ein Steuerzeichen sein? \s bedeutet doch das alle Weisszeichen rausgenommen werden warum muss ich es also escapen? Escapen heisst einfach zu "ersetzten" ?


Aus Java ist auch eine Insel:
Daneben gibt es vordefinierte Zeichenklassen


Weißraum: [ \t\n\x0B\f\r]

\S
 
Nein will ich nicht. Ich will nur alle leeren Stellen weghaben. Ein Beispiel:

Diese Eingabe

Java:
kp.toHashMap("Test        Zwei");

erzeugt mit

Java:
String textOhneLeerzeichen = text.replaceAll("\\s", "eins");

folgende ausgabe

TesteinseinseinseinseinseinseinseinsZwei


Wenn ich nämlich schreibe
Java:
String textOhneLeerzeichen = text.replaceAll("\s", "eins");

Wird \s rotunterwellet in Eclipse. Darum wollte ich fragen warum ich 2 \\ brauche?
 
Wie bereits erwähnt ist \ ein Steuerzeichen und muss escaped werden. Wenn du in einen String \n schreibst, dann kriegst du ein New Line Zeichen. Wenn du aber \n im String haben willst, dann musst du \\n schreiben. Escapen halt 😉
Wenn du nun ein ein \ in Regex suchen willst, musst du das auch in Regex escapen. Also \\ mitgeben. Damit das gemacht wird, musst du den String mit \\\\ befüllen.
 
Hallo,

da jemand ein ähnliches Problem hat wie ich. Hätte ich die Frage, ob es möglich ist aus einem String mehrere Leerzeichen durch ein Leerzeichen zu ersetzten.

zb.

Java:
String text = "Ich     bin            zu blöd zum    Leerzeichen tippen.";

Hatte in Google bereits mal etwas gefunden, nur das Verstehen ist immer ein anderes Thema.

Habs bis jetzt so gelöst, dass ich die replaceAll() Methode mehrmals aufgerufen habe. Und hab immer 2/3/4 Leerzeichen durch 1 ersetzt habe. Gibt das sicherlich einen einfacheren Weg das zu lösen.
 
Wieso mehrmals? Es ist doch replace_ALL_.
Java:
s = s.replaceAll("\\s+", " ");
sollte ausreichen.
 
Es sei anzumerken, dass [c]\s[/c] nicht nur Leerzeichen, sondern auch alle folgenden durch Foo ersetzt werden: [c]\t\n\x0B\f\r[/c].
Wenn du nur Leerzeichen ersetzen willst, genügt [c]replaceAll(" +", " ")[/c]. Aber ich verwende auch meist nicht ein Leerzeichen sondern [c]\s[/c].
 
Wie bereits erwähnt ist \ ein Steuerzeichen und muss escaped werden. Wenn du in einen String \n schreibst, dann kriegst du ein New Line Zeichen. Wenn du aber \n im String haben willst, dann musst du \\n schreiben. Escapen halt 😉
Wenn du nun ein ein \ in Regex suchen willst, musst du das auch in Regex escapen. Also \\ mitgeben. Damit das gemacht wird, musst du den String mit \\\\ befüllen.

Ja das mit dem Escapen ist mir klar. Nur ist es aber so das ich gar kein \ im String suchen/ersetzen will. Warum muss ich also 2 \\ hinzufügen? Ich suche ja nur nach Leerzeichen. Also müsste \s ja reichen?

Oder heisst das das beim Regex vorne immer ein \ kommt, und dadurch das \s "zusammengehören" entsteht ein \\s?
 
Natürlich habe ich die API bereits angeschaut gehabt bevor ich diesen Thread eröffnet habe.Leider muss ich zugeben das ich dem English noch nicht so mächtig bin. Ich weiss das ist ein Manko.

Ich denke die Antwort meines Problems liegt in diesem Abschnitt:

Backslashes within string literals in Java source code are interpreted as required by the Java Language Specification as either Unicode escapes or other character escapes. It is therefore necessary to double backslashes in string literals that represent regular expressions to protect them from interpretation by the Java bytecode compiler. The string literal "\b", for example, matches a single backspace character when interpreted as a regular expression, while "\\b" matches a word boundary. The string literal "\(hello\)" is illegal and leads to a compile-time error; in order to match the string (hello) the string literal "\\(hello\\)" must be used.

Es ist in anscheinend einfach notwendig zwei \ einzufügen aufgrund des Compilers?


Weil ich dachte es muss einfach das rein:

. Any character (may or may not match line terminators)
\d A digit: [0-9]
\D A non-digit: [^0-9]
\s A whitespace character: [ \t\n\x0B\f\r]
\S A non-whitespace character: [^\s]
\w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]
 
Ich habe nochmals ne andere Frage. Ich weiss das ist wirklich simpel habe ich habe mich total verkopft. So nach dem Motto vor lauter Bäume sieht man den Wald nicht mehr. Ich splitte nun eine Eingabe "key1=wert1" in ein String Array. Das sieht dann im String Array so aus [key1,wert1]
Nun muss ich ja das HashArray füllen mit diesem einen Paar ist das kein Problem. Da schreibe ich einfach

Java:
liste.put(gesplittet[0], gesplittet[1]

Später aber kommen noch mehr Werte dazu deshalb muss ich das ja automatisch machen lassen. Irgendwie bekomm ich das nicht hin 😳

Das habe ich jetzt:

Java:
String[] gesplittet = textOhneLeerzeichen.split("\\=");
			System.out.println(Arrays.toString(gesplittet));
	
			for(int i = 0; i < gesplittet.length; i++){
				
			liste.put(gesplittet[i], gesplittet[i++]);
			}

		  System.out.println(gesplittet.length);

Logischwerweise geht er jetz das 2mal nochmal rein und überschreibt die ersten Werte. Wie kann ich das nun am besten lösen das immer ein Paar zusammenbleibt und den gesplittet Array aber durchläuft?
 
Java:
for (int i=0;i<gesplittet.length;i+=2) {
  sysout(gesplittet[i]);
  sysout(gesplittet[i+1]);
}
Sowas.
 
Boh unglaublich!! Glaub mir ich hatte bereits beide Varianten ausprobiert, nur irgendwie nicht gleichzeitg! Dabei ist es ja jetzt klar, ich füge eben i +1 ein, und oben in der for schleife beim i Zähler springe ich mit +2 zum nächsten Paar! Man wieso hab ich das bloss wieder nicht gesehen!

Danke vielmals!🙂
 

Zurück
Oben