首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java String.split() 完整用法詳解與實戰陷阱避坑

     編輯:Java 相關知識

String.split(String regex, int limit) 是字串切割的核心方法,但其正則表達式參數與 limit 參數行為常導致困惑。本文系統講解切割邏輯、limit 三種模式、特殊字元轉義、效能優化與常見錯誤案例。

方法簽名與核心參數


public String[] split(String regex)           // 等同 limit=0
public String[] split(String regex, int limit)
  • regex:正則表達式,非純字串。特殊字元需轉義(如 \\.、\\|、\\$)。
  • limit:控制切割次數與尾部空串保留行為,三種模式差異巨大。

limit 參數三種模式深度解析


String src = "boo:and:foo";

模式 1:limit > 0(最多切割 limit-1 次,最後一段包含剩餘內容)


src.split(":", 2)  // limit=2 → 切 1 次
// 結果:["boo", "and:foo"]  長度=2
src.split(":", 3)  // 切 2 次
// 結果:["boo", "and", "foo"] 長度=3

模式 2:limit < 0(無限制切割,保留尾部空串)


"boo:and:foo".split(":", -1)
// 結果:["boo", "and", "foo"] 長度=3

"boo:and:foo:".split(":", -1)  // 結尾有分隔符
// 結果:["boo", "and", "foo", ""] 長度=4(保留尾部空串)

"oo".split("o", -1)  // 分隔符在首尾
// 結果:["", "", ""] 長度=3

模式 3:limit = 0(預設,無限制切割,丟棄尾部空串)


"boo:and:foo".split(":", 0)
// 結果:["boo", "and", "foo"] 長度=3

"boo:and:foo:".split(":", 0)  // 結尾空串被丟棄
// 結果:["boo", "and", "foo"] 長度=3

"oo".split("o", 0)  // 所有空串被丟棄
// 結果:[] 長度=0  ⚠️ 易導致邏輯錯誤

limit 行為對比總結表

輸入字串regexlimit > 0 (如 3)limit < 0 (如 -1)limit = 0 (預設)
a:b:c:[a, b, c][a, b, c][a, b, c]
a:b:c::[a, b, c:][a, b, c, ""][a, b, c]
:a:b:["", a, b:]["", a, b]["", a, b]
aaaa["", "", "", ""]["", "", "", ""][]

特殊字元轉義:必須雙重轉義

正則元字元:. | $ ^ * + ? { } [ ] ( ) \


// 切割 "1.2.3" 按點
"1.2.3".split("\\.");        // 正確:["1", "2", "3"]
"1.2.3".split(".");          // 錯誤:. 匹配任意字元 → ["", "", "", "", ""]

// 切割 "a|b|c" 按管道符
"a|b|c".split("\\|");        // 正確

// 切割 Windows 路徑 "C:\\Users"
path.split("\\\\");          // 正則需 \\\\,Java 字串再轉義 → 實際傳給引擎 \\ 

技巧:Java 14+ 可用 Pattern.quote(str) 自動轉義整段字串:src.split(Pattern.quote("."))。

效能優化建議

  1. 預編譯 Pattern:高頻切割同一正則時,避免重複編譯。
    
    private static final Pattern COLON_PATTERN = Pattern.compile(":");
    // 使用
    COLON_PATTERN.split(input, limit);
    
  2. 簡單字元切割用 indexOf/substring:單字元分隔符(如逗號、分號)手寫解析比正則快 5-10 倍。
  3. 避免在循環中 split 固定正則:提取為常量 Pattern。

常見錯誤案例與修正

錯誤代碼問題修正
str.split("|")| 為或運算,匹配空字串 → 每字元拆分str.split("\\|")
str.split("."). 匹配任意字元str.split("\\.") 或 Pattern.quote(".")
csv.split(",")未處理引號內逗號、換行用專用 CSV 解析庫
limit=0 導致尾部空串丟失解析 "a,b,c," 少最後一欄用 limit=-1 保留空串

Java 11+ 新增:String.strip()、lines()、split(Pattern)


// 直接傳 Pattern 物件,避免字串轉義麻煩
String[] parts = src.split(Pattern.compile(":"));

// 配合 lines() 處理多行文本
String multi = "line1\nline2\nline3";
List lines = multi.lines().collect(Collectors.toList());

最佳實踐清單

  1. 切割固定字元(非正則)優先用 Pattern.quote() 或預編譯 Pattern。
  2. 需保留尾部空欄位(如 CSV、日誌解析)**務必用 limit=-1**。
  3. 高頻熱點路徑避免 split,改用手寫解析或專用庫。
  4. 正則複雜時單元測試覆蓋邊界:空串、首尾分隔符、連續分隔符。
  5. 跨平台路徑分隔用 FileSystems.getDefault().getSeparator() 而非硬編碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved