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:
publicclassBeispiel{publicstaticvoid 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 =newStringBuilder();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]);}}elseif(chars.length > i +1&& chars[i +1]=='n'){
sb.append('\n');
i++;}elseif(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?