String t = "a||b||c||d";
String[] parts = t.split("\\|\\|");
System.out.println(parts.length); // 輸出 4
System.out.println(Arrays.toString(parts)); // [a, b, c, d]
"\\|\\|" → 編譯器將 \\ 解析為單一反斜線 \,\| 解析為字面值 |。結果字串內容為:\|\|(兩個字元:反斜線、豎線、反斜線、豎線)。\|\|,\| 表示「字面值豎線」(因為 | 是正則特殊字元「或」),所以匹配字面字串 ||。簡記:**Java 層面雙寫反斜線,正則層面轉義特殊字元。**
// 1. 雙重轉義 (標準)
t.split("\\|\\|")
// 2. Unicode 轉義 (無視 Java 層面)
t.split("\\u007c\\u007c") // \u007c = '|'
// 3. Pattern.quote (最推薦,可讀性最高)
t.split(Pattern.quote("||"))
// 4. Character class (單字元匹配)
t.split("[|]{2}") // 或 t.split("\\|{2}")
| 類別 | 序列 | 含義 | Unicode |
|---|---|---|---|
| 八進位 | \0 | 空字元 (NUL) | \u0000 |
| \nn | 兩位八進位 | ||
| \nnn | 三位八進位 (0-377) | ||
| Unicode | \uxxxx | 四位十六進位 | |
| 字面字元 | \" | 雙引號 | \u0022 |
| \' | 單引號 | \u0027 | |
| \\ | 反斜線 | \u005C | |
| \r | 回車 (CR) | \u000D | |
| \n | 換行 (LF) | \u000A | |
| \t | 定位符 (Tab) | \u0009 | |
| \b | 退格 (BS) | \u0008 | |
| \f | 換頁 (FF) | \u000C | |
| 正則特殊字元轉義 | \. | 句點 | \u002E |
| \$ | 美元符號 | \u0024 | |
| \^ | 乘方/行首 | \u005E | |
| \{ | 左大括號 | \u007B | |
| \[ | 左中括號 | \u005B | |
| \( | 左小括號 | \u0028 | |
| \| | 豎線 (或) | \u007C | |
| \) | 右小括號 | \u0029 | |
| \* | 星號 | \u002A | |
| \+ | 加號 | \u002B | |
| \? | 問號 | \u003F | |
| \\ | 反斜線 | \u005C |
Pattern.quote(str):自動處理所有特殊字元,語意清晰。Pattern p = Pattern.compile(regex); p.split(input) 避免重複編譯。String.split("|") 不會按正則處理(JDK 特例優化),但建議統一用 Pattern.quote。split("\\|\\|") 的四個反斜線源於「Java 字面值轉義」與「正則元字元轉義」雙重作用。理解雙層解析機制,善用 Pattern.quote 與 Unicode 轉義,能寫出更健壯、可維護的字串處理代碼。