ZetCode

Java Pattern.split() 方法

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

Pattern.split 方法是 Java 正则表达式包中的一个强大工具。它根据给定的模式匹配项分割输入字符串。对于复杂的分割,此方法比 String.split() 提供更大的灵活性。

当您需要使用复杂的定界符分割字符串,或者需要多次重用相同的模式时,Pattern.split() 特别有用。该方法返回通过分割输入计算的字符串数组。

Pattern.split() 的基本用法

Pattern.split() 的最简单形式仅将输入字符串作为参数。它在模式的每个匹配项处分割字符串。如果匹配项连续发生或在字符串边界处发生,则结果中可能包含空字符串。

BasicSplit.java
package com.zetcode;

import java.util.regex.Pattern;

public class BasicSplit {

    public static void main(String[] args) {
        
        String input = "one,two,three,four";
        Pattern pattern = Pattern.compile(",");
        
        String[] parts = pattern.split(input);
        
        System.out.println("Split results:");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

此示例演示了在逗号定界符上的基本分割。该模式被编译一次,然后用于分割输入字符串。逗号之间的每个元素都成为结果中的一个数组元素。

使用空格分割

Pattern.split() 擅长处理像可变空格这样的复杂定界符。此示例显示了如何根据一个或多个空格字符进行分割,忽略空格的确切计数或类型。

WhitespaceSplit.java
package com.zetcode;

import java.util.regex.Pattern;

public class WhitespaceSplit {

    public static void main(String[] args) {
        
        String input = "apple   orange\tbanana\ncherry";
        Pattern pattern = Pattern.compile("\\s+");
        
        String[] fruits = pattern.split(input);
        
        System.out.println("Split results:");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

模式 \\s+ 匹配一个或多个任何类型的空格字符(空格、制表符、换行符)。与简单的空格字符匹配相比,这提供了更强大的分割能力,尤其是在输入格式不规则的情况下。

使用 Limit 参数分割

limit 参数控制应用模式的次数,从而影响结果数组的长度。正 limit 最多将字符串分割 limit-1 次,而负 limit 允许无限分割,但保留尾随空字符串。

LimitSplit.java
package com.zetcode;

import java.util.regex.Pattern;

public class LimitSplit {

    public static void main(String[] args) {
        
        String input = "one,two,three,four,five";
        Pattern pattern = Pattern.compile(",");
        
        // Limit of 3 means maximum 2 splits
        String[] limited = pattern.split(input, 3);
        
        System.out.println("Split with limit 3:");
        for (String part : limited) {
            System.out.println(part);
        }
        
        // Negative limit keeps trailing empty strings
        String input2 = "one,two,,three,,";
        String[] negativeLimit = pattern.split(input2, -1);
        
        System.out.println("\nSplit with negative limit:");
        for (String part : negativeLimit) {
            System.out.println("'" + part + "'");
        }
    }
}

第一次分割在创建 3 个元素后停止(在 2 次分割后)。第二个示例展示了负 limit 如何保留尾随空字符串,否则这些字符串将被丢弃。这种行为对于某些解析任务非常重要。

在单词边界上分割

Pattern.split() 可以使用像单词边界这样的复杂模式进行分割。此示例将文本分割成单词,同时正确处理标点符号和各种空格情况。

WordBoundarySplit.java
package com.zetcode;

import java.util.regex.Pattern;

public class WordBoundarySplit {

    public static void main(String[] args) {
        
        String input = "Hello! How are you? I'm fine, thanks.";
        Pattern pattern = Pattern.compile("\\W+");
        
        String[] words = pattern.split(input);
        
        System.out.println("Split words:");
        for (String word : words) {
            System.out.println(word);
        }
    }
}

模式 \\W+ 匹配一个或多个非单词字符(标点符号和空格)。这有效地将字符串分割成单词,同时忽略它们之间分隔符的确切性质。

分割和修剪结果

分割字符串时,我们经常需要从结果中修剪空格。此示例展示了如何通过在定界符模式中包含空格来将分割和修剪组合在单个操作中。

TrimSplit.java
package com.zetcode;

import java.util.regex.Pattern;

public class TrimSplit {

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

模式 \\s*,\\s* 匹配一个逗号,该逗号周围可以有可选的空格。这消除了对分割结果进行后处理以删除前导或尾随空格的需要,从而使操作更加有效。

使用多个定界符分割

Pattern.split() 可以使用正则表达式模式中的交替同时处理多个不同的定界符。这比多个分割操作更有效。

MultiDelimiterSplit.java
package com.zetcode;

import java.util.regex.Pattern;

public class MultiDelimiterSplit {

    public static void main(String[] args) {
        
        String input = "apple;orange,banana grape";
        Pattern pattern = Pattern.compile("[,;\\s]");
        
        String[] fruits = pattern.split(input);
        
        System.out.println("Multi-delimiter split results:");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

模式 [,;\\s] 匹配逗号、分号或空格字符。这允许在单个操作中根据多种定界符类型进行分割,这比链接多个 split 调用更有效。

分割时保留分隔符

有时我们需要在分割结果中保留定界符。这可以通过在正则表达式模式中使用前瞻和后顾断言来实现。

KeepDelimitersSplit.java
package com.zetcode;

import java.util.regex.Pattern;

public class KeepDelimitersSplit {

    public static void main(String[] args) {
        
        String input = "3+5-2*8/4";
        Pattern pattern = Pattern.compile("(?<=[+\\-*/])|(?=[+\\-*/])");
        
        String[] tokens = pattern.split(input);
        
        System.out.println("Split with delimiters:");
        for (String token : tokens) {
            System.out.println(token);
        }
    }
}

该模式使用后顾和前瞻断言在任何运算符字符之前或之后进行分割。这将保留运算符作为结果数组中的单独元素,这对于数学表达式解析很有用。

来源

Java Pattern.split() 文档

本教程介绍了 Pattern.split() 方法的各个方面,并提供了实际示例。掌握这些技术将大大提高您在 Java 中的字符串处理能力。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员。 我从 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和 8 本电子书。 拥有超过 8 年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程