Strings ersetzen mit \

tomcom

Mitglied
Mein Code:
Java:
public class Test{
	public static void main(String[] args)   {
		String s = "Hello THIS";
		String backsl = "\\";
	
		System.out.println("This is a Backslash: "+backsl);
		System.out.println(s.replaceAll("THIS", "you"));
		System.out.println(s.replaceAll("THIS", "a"+backsl+"b"));
		System.out.println(s.replaceAll("THIS", backsl));
	}
}
Die Ausgabe:
Code:
This is a Backslash: \
Hello you
Hello ab
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
	at java.lang.String.charAt(String.java:658)
	at java.util.regex.Matcher.appendReplacement(Matcher.java:762)
	at java.util.regex.Matcher.replaceAll(Matcher.java:906)
	at java.lang.String.replaceAll(String.java:2162)
	at Test.main(Test.java:11)
Erwartet Ausgabe:
Code:
This is a Backslash: \
Hello you
Hello a\b
Hello \
Was läuft hier falsch? Generell hab ich beobachtet, dass bei String.replaceFirst() und String.replaceAll()
aus den zweiten Parameter entfernt werden.

Ich nutzen Openjdk 1.7 auf Suse Linux 13.1 64-bit.

Gruß,
Tom
 

tomcom

Mitglied
Die Exception fliegt bei System.out.println(s.replaceAll("THIS", backsl));
Kann das mal jemand selbst kompilieren und schauen, ob die Exception auch fliegt.
Außerdem werden wie gesagt, keine Backslashe aus Parameter 2 ausgegeben (also aus dem Replace Teil).
 

VfL_Freak

Top Contributor
Moin,

Die Exception fliegt bei System.out.println(s.replaceAll("THIS", backsl));
Kann das mal jemand selbst kompilieren und schauen, ob die Exception auch fliegt.
Ja, tut sie ;-)
Außerdem werden wie gesagt, keine Backslashe aus Parameter 2 ausgegeben (also aus dem Replace Teil)
Nein, das ist ja auch klar!
Mach Dir mal klar, was der doppelte Backslash bedeutet rsp. wozu er eingesetzt wird!!

Hier mal ein funktionierendes Beispiel, durch das es vielleicht für Dich klarer wird:
Java:
String sTMP = backsl + '\\';
String sTemp = "a" + sTMP + "b";
System.out.println( s.replaceAll("THIS", sTemp) );
System.out.println( s.replaceAll("THIS", sTMP) );
Sprich, du musst ggf. 4-fach escapen!

Gruß Klaus

EDIT
Hier noch ein paar Links zum Thema
http://www.java-forum.org/java-basics-anfaenger-themen/86407-backslash-escapen.html
Sonderzeichen in Strings und Konkatenation - Java als erste Programmiersprache - Javaschublade
Java Blog Buch : 03.04 Escape-Sequenzen
 
Zuletzt bearbeitet:

tomcom

Mitglied
Das Problem liegt wohl irgendwo im Systemunabhänigen Bereich von Java.
Das sagt der Raspberry Pi B+ mit Oracle Java 8.0
Code:
root@raspberrypi:/tmp# java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)
root@raspberrypi:/tmp# java Test
This is a Backslash: \
Hello you
Hello ab
Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing
        at java.util.regex.Matcher.appendReplacement(Matcher.java:809)
        at java.util.regex.Matcher.replaceAll(Matcher.java:955)
        at java.lang.String.replaceAll(String.java:2210)
        at Test.main(Test.java:11)
 

tomcom

Mitglied
Mir ist schon klar, was der doppelt Backslash bedeutet. Einfach ist er das Escape-Zeichen.
Und doppelt ist halt das Zeichen an sich.
 

Dompteur

Top Contributor
Das Problem tritt auf, weil im 2. Parameter (das Replacement) 2 Zeichen eine besondere Bedeutung haben: "$" (spielt hier keine Rolle) und "\"

Dein Backslash wird also 2 x zum Escapen verwendet.
Zuerst bei der Angabe im Source. Dort sorgt er dafür, dass dein Sourcecode "\\" in Java intern zu "\" wird.
Bei replaceAll wird allerdings noch einmal versucht "\" als Start einer Escape-Sequenz zu interpretieren. Daher erwartet die Routine, dass dahinter noch ein Zeichen kommt.

Wie oben gesagt, müsste dein Replacement so aussehen "\\\\"
 

tomcom

Mitglied
So, ich habe mal einen Workaround gebastelt.
In meinem Programm bekomme ich Texte, von denen ich nicht weiß, ob sie Backslashe enthalten.
Ich hab keinen Einfluß darauf und kann leider nicht "\\\\" statt "\\"schreiben.
Java:
public class StringFormat {
	public static String leadingZero(String s, int zeros){
		int i = 0;
		char[] chars = s.toCharArray();
		StringBuffer sb = new StringBuffer();
		while(chars.length > i && chars[i] >= '0' && chars[i] <= '9'){
			i++;
		}
		for(;zeros>i;zeros--){
			sb.append("0");
		}
		sb.append(s);
		
		return sb.toString();
	}
	
	public static String cutoffZeroBytes(String str){
		int i=-1;
		boolean hasZeroByte = false;
		//System.out.println("old length : "+str.length());
		for (char c : str.toCharArray()) {
			i++;
			if(c=='\0'){
				hasZeroByte = true;
				break;
			}
		}
		if(!hasZeroByte)
			return str;

		//System.out.println("new length : "+str.substring(0, i).length()+"\ti="+i);
		return str.substring(0, i);
	}
	
	public static String replaceAllwithBS(String orig, String regex, String repl){
		return orig.replaceAll(regex, repl.replaceAll("\\\\", "\\\\\\\\"));
	} 
	
	public static String replaceFirstwithBS(String orig, String regex, String repl){
		return orig.replaceFirst(regex, repl.replaceAll("\\\\", "\\\\\\\\"));
	} 
}
 

Dompteur

Top Contributor
Wenn du in deinem Replacement bewußt die beiden Spezialzeichen nicht verwenden willst, dann reicht es deinen Replacementstring zu quoten.

In der Matcher Klasse findest du dazu : "public static String quoteReplacement(String s)"

Also:
Java:
        System.out.println(s.replaceAll("THIS", Matcher.quoteReplacement(backsl)));
 
Zuletzt bearbeitet:

tomcom

Mitglied
Die Klasse Korrigiert Fehler aus der Stringklasse und Stellt Erweiterungen zur Verfügung.

Die Funktionen leadingZeros() stzt führende Nullen vor eine Zahl im Stringformat.
Beispiel ledingZero("1",2) ergibt 01.

Die Funktion cutoffZeroBytes() erstellt ein neues String-Objekt, aus dem alle Null-Byte-Felder entfernt wurden.
Werden Strings über das Netzwerk übertragen, passiert es leider, dass wenn der String nicht exakt die Länge des Buffers der Socket entspricht, dass im String-Objekt selbst, die Null-Bytes am Ende des buffers, Teil des Strings sind.
In Eclipse kann man das im Debug Modus schön sehen.
Man setzt einen Breakpoint unterhalb der Zeile, in der der Socket-Buffer (byte[]) in einen String gewandelt wurde.
Die Länge des Strings entspricht der Buffersize.
Schaut man sich im Debugfenster den Stringwert an, wird in diesem Moment, die Länge auf die korrekte Länge korrigiert.
Lässt man das Programm ohne den Wert anzuschauen weiterlaufen oder führt man es nicht im Debugmodus aus, bleibt die String-Lenth natürlich auf Buffersize und jedes String.equals() und String.equalsIgnoreCase() gibt immer false zurück.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Gleichzeitiges ersetzen mehrerer Strings Java Basics - Anfänger-Themen 7
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
hello_autumn Strings ersetzen... Java Basics - Anfänger-Themen 10
A Datentypen Sonderzeichen / Strings ersetzen Java Basics - Anfänger-Themen 3
K Ersetzen von Teilstrings in ArrayList von Strings Java Basics - Anfänger-Themen 11
S Datentypen In mehreren Dateien Strings ersetzen Java Basics - Anfänger-Themen 14
V Teile eines Strings intelligent ersetzen, kompliziert! Java Basics - Anfänger-Themen 4
T Substrings in Strings ersetzen ohne java.lang.String Java Basics - Anfänger-Themen 8
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
N Nachkommastellen von Strings Java Basics - Anfänger-Themen 3
T Strings unveränderlich???? Java Basics - Anfänger-Themen 22
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
S Die durchschnittliche Länge der Strings Java Basics - Anfänger-Themen 11
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
sserio StringBuilder und Strings Java Basics - Anfänger-Themen 8
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
N Strings verpflechten Java Basics - Anfänger-Themen 4
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
L Strings aneinanderhängen Java Basics - Anfänger-Themen 2
M Strings vergleichen Java Basics - Anfänger-Themen 10
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Strings mit gerader und ungerader Länge ausgeben Java Basics - Anfänger-Themen 10
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
W Strings und das parsen Java Basics - Anfänger-Themen 8
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Vergleichen von Strings Java Basics - Anfänger-Themen 6
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
S Buchstaben in Großbuchstaben (Strings) Java Basics - Anfänger-Themen 5
X Anagramm mit Strings und Methode Java Basics - Anfänger-Themen 53
P geschachtelte Schleife mit Strings Java Basics - Anfänger-Themen 2
P Strings mit der Axt zerteilen Java Basics - Anfänger-Themen 7
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
K Strings hochzählen Java Basics - Anfänger-Themen 20
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
J Unveränderbarkeit von Strings Java Basics - Anfänger-Themen 3
O Klammerung bei Strings Java Basics - Anfänger-Themen 10
A Liste aus drei Strings erstellen Java Basics - Anfänger-Themen 5
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
G Teil(e) eines Strings entfernen wenn spezifische Zeichen (< & >) vorkommen Java Basics - Anfänger-Themen 5
D ergebnis.matches("[1-9]?[0-9].[0-9][0-9]?") ein teil eines größeren Strings Java Basics - Anfänger-Themen 12
J Breite eines Strings bestimmen Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
F JList Elemente mit Strings vergleichen Java Basics - Anfänger-Themen 12
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
N Vergleich von Strings schlägt fehl.. Java Basics - Anfänger-Themen 5
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
B mir nur die Gesamtzahl von einzigartigen Strings aus Array ausgeben lassen Java Basics - Anfänger-Themen 5
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
F Maximale Länge eines Strings Java Basics - Anfänger-Themen 5
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Variablen Zahlen aus Strings auslesen Java Basics - Anfänger-Themen 4
C 2 Strings Java Basics - Anfänger-Themen 15
T befehle unterschiedlicher anzahl an strings wiedergeben Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Strings in andere Klassen importieren. Java Basics - Anfänger-Themen 2
D BlueJ Java: Strings voneinander trennen Java Basics - Anfänger-Themen 11
javaerd Wie kann ich Brute Force Methode mit Strings erweitern Java Basics - Anfänger-Themen 1
R Erste Schritte Strings "einrücken" Java Basics - Anfänger-Themen 3
Yamie ArrayList<Object> als Liste von Strings ausgeben? Java Basics - Anfänger-Themen 15
B gemeinsames Vorkommen der charactere von 2 Strings als String zurückgeben Java Basics - Anfänger-Themen 5
R Teilinhalt eines Strings testen Java Basics - Anfänger-Themen 10
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
L Werte von Strings ? Java Basics - Anfänger-Themen 1
L Strings und Arrays - Expand Java Basics - Anfänger-Themen 12
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
F Wahrscheinlichkeit von Strings Java Basics - Anfänger-Themen 3
MiMa Splitten eines Strings Java Basics - Anfänger-Themen 5
T Hashfunktion für Strings Java Basics - Anfänger-Themen 3
C Zeilenumbruch für langes Strings Java Basics - Anfänger-Themen 2
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
H Strings vergleichen & sortieren Java Basics - Anfänger-Themen 20
H Erste Schritte Längstes Wort eines Strings herausfinden Java Basics - Anfänger-Themen 7
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
G Strings mit Scanner (nextLine) einlesen Java Basics - Anfänger-Themen 7
K Strings bearbeiten Java Basics - Anfänger-Themen 14
N Bestimmte Zeichen eines Strings umwandeln Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben