2012-12-13 7 views
9

Wie ersetzt man \ 0 (NUL) im String?Sonderzeichen 0 {NUL} in Java

String b = "2012yyyy06mm";    // sth what i want 
String c = "2\0\0\0012yyyy06mm"; 
String d = c.replaceAll("\\\\0", ""); // not work 
String e = d.replace("\0", "");   // er, the same 
System.out.println(c+"\n"+d+"\n"+e); 

String bb = "2012yyyy06mm"; 
System.out.println(b.length() + " > " +bb.length()); 

Der obige Code wird 12> 11 in der Konsole drucken. Ups, was ist passiert?

String e = c.replace("\0", ""); 
System.out.println(e);  // just print 2(a bad character)2yyyy06mm 

Antwort

14

Ihre Zeichenfolge "2\0\0\0012yyyy06mm" startet nicht 2 {NUL} {NUL} {NUL} 0 1 2, sondern enthält 2 {NUL} {NUL} {SOH} 2.

The \001 wird als einzelnes ASCII 1 Zeichen (SOH) und nicht als durch 1 2 gefolgt NUL behandelt.

Das Ergebnis ist, dass nur zwei Zeichen entfernt werden, nicht drei.

Ich glaube nicht, gibt es eine Möglichkeit, Ziffern nach einer abgekürzten octal escape anderen darzustellen, als durch die Zeichenfolge auseinander zu brechen:

String c = "2" + "\0\0\0" + "012yyyy06mm"; 

oder abwechselnd, geben Sie bitte alle drei Stellen in der (letzten) Oktal entkommen, so dass die folgenden Ziffern werden nicht als Teil der oktal Flucht interpretiert:

String c = "2\000\000\000012yyyy06mm"; 

Sobald Sie das getan haben, ersetzen "\0" wie pro Ihre Linie:

String e = c.replace("\0", ""); 

wird korrekt funktionieren.

+0

Hallo, tls für Hilfe. String c = "2 \ 0 \ 0 \ 0012yyyy06mm"; \t \t Zeichenfolge e = c.replace ("\ 0", ""); \t \t System.out.println (e); \t \t \t \t // nur drucken 22yyyy06mm – user1900556

+1

@ user1900556 ja, weil das '\ 001' immer noch darin eingebettet ist (zwischen den beiden" 2 "s) ist unsichtbar. Der springende Punkt ist, dass die Zeichenfolge "c", die Sie haben, nicht enthält, was Sie denken, dass es tut. – Alnitak

+0

Es gibt keinen Weg? Wie sonst kann es gemacht werden? – user1900556