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

Java String.split() 完整參數行為解析:limit 正負零三種模式實戰

     編輯:Java 綜合教學

方法簽名

public String[] split(String regex)
public String[] split(String regex, int limit)

無參版等同 split(regex, 0)。

limit 參數三種模式對比

limit 值行為匹配次數尾部空串處理
limit > 0最多分割 limit 段,即應用模式 limit-1 次最多 limit-1 次保留
limit < 0無限制分割,應用模式盡可能多次無限保留
limit = 0無限制分割無限丟棄

實戰範例與輸出

1. limit = 2(正數)

String s = "boo:and:foo";
String[] r = s.split(":", 2);
// r = ["boo", "and:foo"]  // 僅分割 1 次,剩餘部分保留原樣

2. limit = -2(負數)

String s = "boo:and:foo";
String[] r = s.split(":", -2);
// r = ["boo", "and", "foo"]  // 全部分割,保留尾部空串(此處無)

3. limit = 0(預設)vs limit = -2 差異

String s = "boo:and:foo";
String[] r0 = s.split("o", 0);   // 分割字元 'o'
String[] r1 = s.split("o", -2);

System.out.println(Arrays.toString(r0)); // [b, , :and:f]        // 尾部空串被丟棄
System.out.println(Arrays.toString(r1)); // [b, , :and:f, , ]    // 尾部空串保留

4. 邊界情況:分割字元在首尾


原始碼關鍵邏輯

// java.lang.String.split 核心片段
public String[] split(String regex, int limit) {
    return pattern.split(this, limit);
}

// java.util.regex.Pattern.split
public String[] split(CharSequence input, int limit) {
    int index = 0;
    boolean matchLimited = limit > 0;
    ArrayList matchList = new ArrayList<>();
    Matcher m = matcher(input);
    while (m.find()) {
        if (matchLimited && matchList.size() == limit - 1) break; // 達到上限停止
        matchList.add(input.subSequence(index, m.start()).toString());
        index = m.end();
    }
    matchList.add(input.subSequence(index, input.length()).toString()); // 最後一段

    // limit == 0 時移除尾部空串
    if (limit == 0) {
        int i = matchList.size();
        while (i > 0 && matchList.get(i - 1).length() == 0) i--;
        matchList.subList(i, matchList.size()).clear();
    }
    return matchList.toArray(new String[0]);
}

常見坑點避雷

  1. 正則元字元需轉義:split(".") 分割任意字元,需 split("\\.") 或 split(Pattern.quote("."))。
  2. 效能陷阱:大字串頻繁 split 創建大量陣列與字串物件,考慮 StringTokenizer、Scanner 或手寫解析。
  3. limit=0 丟棄尾部空串 導致 CSV 解析漏列,CSV 必須用 limit=-1。
  4. Java 8+ Pattern.splitAsStream 返回 Stream,配合 limit(n) 可流式處理,避免全量陣列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved