一、前話
看似小小的一個問題,卻往往足矣讓我們困惑了半小時、一小時甚至更久的時間。當你得知真相後,總是會憤怒地罵道:“居然是這樣!這不是坑爹麼!”。嗯哼,這能怪誰?只能說明自己還太嫩!So……平時還是要多注意些細節,要不斷的積累不斷的豐富經驗,日後才能有顯擺的資本。
--------------------------------------分割線 --------------------------------------
編寫高質量代碼 改善Java程序的151個建議 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm
Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm
Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm
Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm
Java對象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm
--------------------------------------分割線 --------------------------------------
二、天真的以為
replaceAll()這方法太常見了,一般的字符替換都好理解。但是如果你所要替換的出現了"\"的話,那可就不大一樣了。例如:
str = "D:\test\test2\test3";
要把s1字符串中的"\"替換成"\\";
嗯,很多人可能誤以為是這麼寫: str.replaceAll("\\","\\\\");
可實際上正確的應該是這樣子寫: str.replaceAll("\\\\","\\\\\\\\");
三、真相是這樣
OMG~怎麼要這麼多條槓?不要驚訝,原因其實很簡單。
1、因為"\"在java中是轉義符,在正則表達式中也是轉義符號
2、String.replaceAll(regex, replacement)實際用的是正則表達式的規則去匹配的
3、先java轉義,"\\\\"--解釋成-->"\\";再方法中的正則轉義,"\\"---解釋成-->"\"
總結下:在java中要用正則來表示一個"\",則需4個"\"即("\\\\")。表示"\\",則需要8個"\"即("\\\\\\\\")……以此類推。
四、碎碎念
結語:細心,這東西真的很重要。