1.八進制轉義序列:\ + 1到3位5數字;範圍'\000'~'\377' \0:空字符 2.Unicode轉義字符:\u + 四個十六進制數字;0~65535 \u0000:空字符 3.特殊字符:就3個 \":雙引號 \':單引號 \\:反斜線 4.控制字符:5個 \' 單引號字符 \\ 反斜槓字符 \r 回車 \n 換行 \f 走紙換頁 \t 橫向跳格 \b 退格 點的轉義:. ==> u002E 美圓符號的轉義:$ ==> u0024 乘方符號的轉義:^ ==> u005E 左大括號的轉義:{ ==> u007B 左方括號的轉義:[ ==> u005B 左圓括號的轉義:( ==> u0028 豎線的轉義:| ==> u007C 右圓括號的轉義:) ==> u0029 星號的轉義:* ==> u002A 加號的轉義:+ ==> u002B 問號的轉義:? ==> u003F 反斜槓的轉義: ==> u005C ====================================================================== 下面的程序使用了兩個Unicode的轉義字符,它們是用其十六進制代碼來表示Unicode字符。那麼,這個程序會打印什麼呢? Java代碼 public class EscapeRout{ public static void main(String[] args){ // \u0022 是雙引號的Unicode轉義字符 System.out.println("a\u0022.length() +\u0022b".length()); } } public class EscapeRout{ public static void main(String[] args){ // \u0022 是雙引號的Unicode轉義字符 System.out.println("a\u0022.length() +\u0022b".length()); } } 對該程序的一種很膚淺的分析會認爲它應該打印出26,由於在由兩個雙引號"a\u0022.length()+\u0022b"標識的字符串之間總共有26個字符。 稍微深刻一點的分析會認爲該程序應該打印16,由於兩個Unicode轉義字符每個在源文件中都須要用6個字符來表示,可是它們只表示字符串中 的一個字符。所以這個字符串應該比它的外表看其來要短10個字符。 若是你運行這個程序,就會發現事情遠不是這麼回事。它打印的既不是26也不是16,而是2。 理解這個謎題的關鍵是要知道:Java對在字符串字面常量中的Unicode轉義字符沒有提供任何特殊處理。編譯器在將程序解析成各類符號以前, 先將Unicode轉義字符轉換成爲它們所表示的字符[JLS 3.2]。所以,程序中的第一個Unicode轉義字符將做爲一個單字符字符串字面常量("a")的結束引號,而第二個Unicode轉義字符將做爲另外一 個單字符字符串字面常量("b")的開始引號。程序打印的是表達式"a".length()+"b".length(),即2。 若是該程序的做者確實但願獲得這種行爲,那麼下面的語句將要清楚得多: Java代碼 System.out.println("a".length()+"b".length()); 更有可能的狀況是該做者但願將兩個雙引號字符置於字符串字面常量的內部。使用Unicode轉義字符你是不能實現這一點的,可是你可使用轉義字 符序列來實現[JLS 3.10.6]。表示一個雙引號的轉義字符序列是一個反斜槓後面緊跟着一個雙引號(\」)。若是將最初的程序中的Unicode轉義字符用轉義字符序列來 替換,那麼它將打印出所指望的16(錯誤,應該是14,不知道是怎麼會出來16): Java代碼 System.out.println("a\".length()+\"b".length()); 許多字符都有相應的轉義字符序列,包括單引號(\')、換行(\n)、製表符(\t)和反斜線(\\)。你能夠在字符字面常量和字符串字面常量中使用轉義字符序列。 實際上,你能夠經過使用被稱爲八進制轉義字符的特殊類型的轉義字符序列,將任何ASCII字符置於一個字符串字面常量或一個字符字面常量中,可是最好是儘量地使用普通的轉義字符序列。 普通的轉義字符序列和八進制轉義字符都比Unicode轉義字符要好得多,由於與Unicode轉義字符不一樣,轉義字符序列是在程序被解析爲各類符號以後被處理的。 ASCII是字符集的最小公共特性集,它只有128個字符,可是Unicode有超過65,000個字符。一個Unicode轉義字符能夠被用來在只使用ASCII字符的程序中插入一個Unicode字符。一個Unicode轉義字符精確地等價於它所表示的字符。 Unicode轉義字符被設計爲用於在程序員須要插入一個不能用源文件字符集表示的字符的狀況。它們主要用於將非ASCII字符置於標識符、字符 串字面常量、字符字面常量以及註釋中。偶爾地,Unicode轉義字符也被用來在看起來頗爲類似的數個字符中明確地標識其中的某一個,從而增長程序的清晰 度。 總之,在字符串和字符字面常量中要優先選擇的是轉義字符序列,而不是Unicode轉義字符。Unicode轉義字符可能會由於它們在編譯序列中 被處理得過早而引發混亂。不要使用Unicode轉義字符來表示ASCII字符。在字符串和字符字面常量中,應該使用轉義字符序列;對於除這些字面常量之 外的狀況,應該直接將ASCII字符插入到源文件中。 ----------------------------------------------------------摘自網絡 補: java String 分割 split 特殊字符 須要注意如下特殊字符 (均須要轉義\\) "|" "." "*" "_" "+" "" api: public String[] split(String regex)Splits this string around matches of the given regular expression. 參數regex是一個 regular-expression的匹配模式而不是一個簡單的String,他對一些特殊的字符可能會出現你預想不到的結果, 好比測試下面的代碼:用豎線 | 分隔字符串,你將得不到預期的結果String[] aa = "aaa|bbb|ccc".split("|"); "|" 分隔串時雖然可以執行,可是卻不是預期的目的,"\\|"轉義後便可獲得正確的結果。 //String[] aa = "aaa|bbb|ccc".split("\\|"); (right) 用豎 * 分隔字符串運行將拋出java.util.regex.PatternSyntaxException異常,用加號 + 也是如此。 String[] aa = "aaa*bbb*ccc".split("*"); //String[] aa = "aaa|bbb|ccc".split("\\*");(right) }顯然,+ * 不是有效的模式匹配規則表達式,用"\\*" "\\+"轉義後便可獲得正確的結果。 還有若是想在串中使用""字符,則也須要轉義.首先要表達"aaaa\bbbb"這個串就應該用"aaaa\\bbbb", 若是要分隔就應該這樣才能獲得正確結果:String[] aa = "aaa\\bbb\\bccc".split("\\\");(right)java |