Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Doppelter Backslash durch einen einfachen Backslash ersetzen
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?
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
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
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?