2012-12-13 182 views
9

如何在字符串中替換\ 0(NUL)?Java中的特殊字符 0 {NUL}

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()); 

上述代碼將在控制檯中打印12> 11。哎呀,發生了什麼?

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

回答

14

您的字符串"2\0\0\0012yyyy06mm"不啓動2 {NUL} {NUL} {NUL} 0 1 2,而是包含2 {NUL} {NUL} {SOH} 2

\001被視爲單個ASCII 1字符(SOH),而不是NUL,然後是1 2

結果是隻有兩個字符被刪除,而不是三個。

我不認爲有任何的方式來表示位數以下的縮寫octal escape其他比除了打破字符串:

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

或交替,指定所有三位數的(最後一個)八進制轉義,使得下面的數字不解釋爲八進制轉義的一部分:

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

一旦你做到了這一點,取代"\0"按您行:

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

將正常工作。

+0

嗨,請幫忙。 String c =「2 \ 0 \ 0 \ 0012yyyy06mm」; \t \t String e = c.replace(「\ 0」,「」); \t \t System.out.println(e); \t \t \t \t //只是打印22yyyy06mm – user1900556

+1

@ user1900556是的,因爲仍然嵌入其中的'\ 001'(在兩個「2」之間)是不可見的。整個觀點是,你所擁有的字符串「c」並不包含你認爲它所做的事情。 – Alnitak

+0

有沒有辦法?該怎麼辦呢? – user1900556