目的:將字符串中不是以\開頭的數字以*代替。
如:對於字符串:abc11,cd123 \\0123,68,T5699
處理後的結果應該是:abc*,cd* \0123,*,T*
開始想到的表達式是(?<![\\\\d])([0-9]+){1,}
在http://gskinner.com/RegExr/ 上驗證的結果是abc*,cd1* \\0*,*,T*
這就奇怪了,爲什麼\\0123中的123被匹配了?
根據RegExr的實時提示,\\\\d所表示的轉義之後的\ \ d,被解釋爲兩個\和一個d,意思是只要是\和字母d就可以。
所以應該把他換爲\\\d,也就是說,\d中的\是不需要用\\來表示,\d本身就是一個轉義。
還有一種解決方式是創建一個abc, cd這樣形式的一個分組(小括號擴起來的表達式:(regx)),然後再String的replaceAll的replacementString中引用這個分組的匹配結果,使得這個分組保持不變:
String s5 = "abc11,cd123 \\0123,68,T5699";
String s6 = s5.replaceAll("([^\\\\\\d])\\d+", "$1*");
$1表示第一個分組([^\\\\\\d])的匹配結果:abc,cd和T
$符號在正則表達式中有兩種含義:
1.在String/Pattern的replace方法的replacement中表示對正則表達式組的引用,如上面的用法
2.匹配字符串的結束位置(是位置,不是字符,不表示字符串的結束字符)。(字符串的開始位置用^表示。單詞的開始和結束都是用\b表示)
參考文章:http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html