ZetCode

Java String.split 方法

上次修改时间:2025 年 4 月 20 日

Java 中的 String.split 方法根据正则表达式的匹配将字符串分割。它返回一个字符串数组,该数组由分割原始字符串计算得出。此方法通常用于解析文本数据。

split 方法有两个变体:一个接受正则表达式模式,另一个接受正则表达式和 limit 参数。limit 控制模式应用的次数,并影响结果数组的长度。

String.split 概述

split 方法是 Java String 类的一部分。它使用正则表达式来确定在哪里分割字符串。该方法对于处理 CSV 文件、日志文件和其他结构化文本数据非常有用。

如果未找到匹配项,则该方法返回一个包含原始字符串的数组。分隔符之间的空字符串包含在结果中,除非受到 limit 参数的限制。

基本字符串分割

split 的最简单形式是将正则表达式作为输入。字符串在正则表达式的每个匹配项处分割。此示例演示了使用逗号作为分隔符的基本分割。

BasicSplit.java
package com.zetcode; 

public class BasicSplit {

    public static void main(String[] args) {
        String data = "apple,orange,banana,grape";
        String[] fruits = data.split(",");
        
        System.out.println("Split results:");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

此代码将一个逗号分隔的字符串分割成一个水果名称数组。输出将包含四个元素:“apple”、“orange”、“banana” 和 “grape”。逗号充当值之间的分隔符。

使用正则表达式进行分割

split 方法可以使用复杂的正则表达式作为分隔符。此示例演示了使用多个可能的分隔符进行分割。

RegexSplit.java
package com.zetcode;

public class RegexSplit {

    public static void main(String[] args) {
        String data = "apple;orange,banana grape";
        String[] fruits = data.split("[;,]\\s*");
        
        System.out.println("Split results:");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

在这里,我们使用分号或逗号后跟可选的空格来分割字符串。正则表达式模式 "[;,]\\s*" 匹配 ; 或 ,,后跟任意数量的空格字符。这处理了输入字符串中不一致的格式。

使用 Limit 参数进行分割

limit 参数控制模式应用的次数。正 limit 限制分割的次数,而负 limit 允许无限分割,但保留尾随空字符串。

LimitSplit.java
package com.zetcode;

public class LimitSplit {

    public static void main(String[] args) {
        String data = "one,two,three,four,five";
        
        // Limit of 3
        String[] limited = data.split(",", 3);
        System.out.println("Split with limit 3:");
        for (String item : limited) {
            System.out.println(item);
        }
        
        // Negative limit (keeps trailing empty strings)
        String data2 = "a,b,c,,,";
        String[] negativeLimit = data2.split(",", -1);
        System.out.println("\nSplit with negative limit:");
        for (String item : negativeLimit) {
            System.out.println("'" + item + "'");
        }
    }
}

第一个 limit 为 3 的分割产生 ["one", "two", "three,four,five"]。第二个 -1 的分割保留了末尾的所有空字符串,显示了限制如何影响结果。当您需要保留空的尾随字段时,负 limit 很有用。

按空格分割

一个常见的用例是按空格分割文本。\\s+ 正则表达式匹配一个或多个空格字符,使其非常适合此目的。

WhitespaceSplit.java
package com.zetcode; 

public class WhitespaceSplit {

    public static void main(String[] args) {
        String text = "The quick   brown fox jumps over  the lazy dog";
        String[] words = text.split("\\s+");
        
        System.out.println("Words count: " + words.length);
        for (String word : words) {
            System.out.println(word);
        }
    }
}

此示例将一个句子分割成单词,处理单词之间的多个空格。\\s+ 模式匹配任何空格字符序列(空格、制表符、换行符)。这确保了在不一致的间距下进行一致的分割。

分割和修剪结果

处理用户输入时,您通常需要分割并从结果中修剪空格。此示例演示了如何将分割与修剪结合起来。

TrimSplit.java
package com.zetcode; 

public class TrimSplit {

    public static void main(String[] args) {
        String input = " apple , orange , banana , grape ";
        String[] fruits = input.split("\\s*,\\s*");
        
        System.out.println("Trimmed split results:");
        for (String fruit : fruits) {
            System.out.println("'" + fruit + "'");
        }
    }
}

正则表达式 \\s*,\\s* 匹配带有任一侧可选空格的逗号。这有效地在逗号处分割字符串,同时自动从结果元素中修剪空格。输出包含干净的值,没有前导或尾随空格。

使用前瞻/后顾进行分割

高级正则表达式功能(如前瞻和后顾)允许在保留分隔符的同时进行分割。当您需要保留分割字符时,这很有用。

LookaroundSplit.java
package com.zetcode; 

public class LookaroundSplit {

    public static void main(String[] args) {
        String equation = "2+3-4*5/6";
        // Split at operators but keep them
        String[] parts = equation.split("(?<=[-+*/])|(?=[-+*/])");
        
        System.out.println("Equation parts:");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

此示例在操作符处分割数学方程式,同时将操作符保留为单独的元素。正则表达式使用正后顾 (?<=...) 和正前瞻 (?=...) 在运算符周围进行分割,而不会消耗它们。结果在数字和运算符之间交替出现。

分割空字符串

分割空字符串或仅包含分隔符的字符串时,需要特别考虑。行为根据 limit 参数而变化。

EmptySplit.java
package com.zetcode; 

public class EmptySplit {
    
    public static void main(String[] args) {
        String empty = "";
        String[] emptySplit = empty.split(",");
        System.out.println("Empty string split length: " + emptySplit.length);
        
        String delimitersOnly = ",,,";
        String[] defaultSplit = delimitersOnly.split(",");
        String[] keepEmpty = delimitersOnly.split(",", -1);
        
        System.out.println("\nDefault split length: " + defaultSplit.length);
        System.out.println("Split with -1 limit length: " + keepEmpty.length);
    }
}

空字符串返回一个包含一个空字符串的数组。对于仅包含分隔符的字符串,默认行为会删除尾随空字符串,而负 limit 会保留它们。理解这些边缘情况对于可靠的字符串处理很重要。

来源

Java String.split 文档

本教程涵盖了 Java String.split 方法的基本方面。从基本用法到高级正则表达式模式,这些示例演示了该方法在字符串处理任务中的多功能性。

作者

我的名字是 Jan Bodnar,是一位经验丰富的程序员,在这一领域拥有多年经验。我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和 8 本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程