Doppelter Backslash durch einen einfachen Backslash ersetzen

aychiquita

Mitglied
Hallo,

ich habe folgendes Problem: In einem String steht ein doppelter Backslash. Nun möchte ich den doppelten Backslash durch einen einfachen Backslash ersetzen. Beispiel:

Java:
public class Beispiel {
	public static void main (String [] args) {
		String s1 = "F\\u00fcrth";
		System.out.println(s1);
	}
}

Wie schaffe ich es, das geprintete F\u00fcrth durch Fürth zu ersetzen?

Java:
s1.replaceAll("\\\\", "\\");

tut nicht das Gewünschte.

Beste Grüße
 
Etwas umfangreicher - aber funktioniert:

Java:
        String s1 = "F\\u00fcrth";
        char[] chars = s1.toCharArray();
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '\\') {
                if (chars.length > i + 5 && chars[i + 1] == 'u') {
                    try{
                        char x = (char) Integer.parseInt(s1.substring(i+2, i+6), 16);
                        sb.append(x);
                        i = i + 5;
                    } catch(NumberFormatException e){
                        //not a hex encoding
                        sb.append(chars[i]);
                    }
                } else if (chars.length > i + 1 && chars[i + 1] == 'n') {
                    sb.append('\n');
                    i++;
                } else if (chars.length > i + 1 && chars[i + 1] == 'r') {
                    sb.append('\r');
                    i++;
                //... etc for \t...
                }  else {
                    sb.append(chars[i]);
                }
            } else {
                sb.append(chars[i]);
            }
        }
        s1 = sb.toString();
        System.out.println(s1);

Zur Erläuterung - du machst ja auch 6 einzelnen chars einen hexcodierten char. Das geht mit replace nicht so ohne weiteres. Evtl mit viel regex gespiele im replaceAll
 
Zuletzt bearbeitet von einem Moderator:
Hallo fassy,

vielen Dank für deine Mühe - Das funktioniert einwandfrei und ist eine Lösung, auf die ich auf Anhieb nicht gekommen wäre.

Beste Grüße
 
Keine Ahnung, was fassy da versucht und was an deinem [c]replaceAll()[/c] nicht funktionieren sollte... Du hast einfach schlichtweg keine doppelten Backslashes im String [c]s1[/c]...

Edit: ah, fassy's Comment gelesen 😉 Trotzdem: meine Aussage sollte sich der TO nochmals durch den Kopf gehen lassen
 
vielen Dank für deine Mühe - Das funktioniert einwandfrei und ist eine Lösung, auf die ich auf Anhieb nicht gekommen wäre.

Gern geschehn... War auch keine Mühe, den Code habe ich aus meiner Toolbox kopiert. Hab ich irgendwann mal entwickelt als ich vor einem ähnlichen Problem stand und immer mal wieder gebraucht. Solltest dir vielleicht auch als Methode in eine Utility-Klasse packen wenn du es öfter brauchst.

@faetzminator
Ja, das ist wohl richtig - es geht weniger drum Backslashes zu ersetzen als darum chars sequencen umzukodieren.
 
Auch hier würde ich aber auf [c]replaceAll()[/c] zurückgreifen. Natürlich benötigt man für [c]\u[/c] eine Schleife (mit Matcher), aber z.B. würde ich [c]\n[/c] so ersetzen: [c]replaceAll("^((.*[^\\\\])?(\\\\{2})*)\\\\n", "$1\n")[/c]
 
Natürlich geht das, aber wenn du das mit allen möglichen Zeichen machen möchtest wird der Regex wirklich unübersichtlich und sehr komplex. Ansonsten würde ich dich bitten das kurz allein mal für die ASCII Zeichen + deutsche Umlaute als Regexp auszudrücken - würd mich echt interessieren?

Oder würdest du pro (Sonder)Zeichen einmal replaceAll laufen lassen wollen?
 

Zurück
Oben