Java String.split 方法
上次修改时间:2025 年 4 月 20 日
Java 中的 String.split 方法根据正则表达式的匹配将字符串分割。它返回一个字符串数组,该数组由分割原始字符串计算得出。此方法通常用于解析文本数据。
split 方法有两个变体:一个接受正则表达式模式,另一个接受正则表达式和 limit 参数。limit 控制模式应用的次数,并影响结果数组的长度。
String.split 概述
split 方法是 Java String 类的一部分。它使用正则表达式来确定在哪里分割字符串。该方法对于处理 CSV 文件、日志文件和其他结构化文本数据非常有用。
如果未找到匹配项,则该方法返回一个包含原始字符串的数组。分隔符之间的空字符串包含在结果中,除非受到 limit 参数的限制。
基本字符串分割
split 的最简单形式是将正则表达式作为输入。字符串在正则表达式的每个匹配项处分割。此示例演示了使用逗号作为分隔符的基本分割。
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 方法可以使用复杂的正则表达式作为分隔符。此示例演示了使用多个可能的分隔符进行分割。
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 允许无限分割,但保留尾随空字符串。
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+ 正则表达式匹配一个或多个空格字符,使其非常适合此目的。
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+ 模式匹配任何空格字符序列(空格、制表符、换行符)。这确保了在不一致的间距下进行一致的分割。
分割和修剪结果
处理用户输入时,您通常需要分割并从结果中修剪空格。此示例演示了如何将分割与修剪结合起来。
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* 匹配带有任一侧可选空格的逗号。这有效地在逗号处分割字符串,同时自动从结果元素中修剪空格。输出包含干净的值,没有前导或尾随空格。
使用前瞻/后顾进行分割
高级正则表达式功能(如前瞻和后顾)允许在保留分隔符的同时进行分割。当您需要保留分割字符时,这很有用。
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 参数而变化。
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教程。