Java中如何分割字符串

Java中如何分割字符串

技术背景

在Java编程中,字符串分割是一个常见的操作。例如,当处理用户输入、解析文件内容或处理网络数据时,经常需要将一个字符串按照特定的分隔符拆分成多个子字符串。Java提供了多种方法来实现字符串分割,每种方法都有其特点和适用场景。

实现步骤

1. 使用String.split()方法

String.split()方法是最常用的字符串分割方法,它接受一个正则表达式作为分隔符。

1
2
3
4
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556

需要注意的是,split()方法的参数被视为正则表达式,因此如果分隔符是正则表达式的特殊字符,需要进行转义。例如,要按点(.)分割字符串,可以使用以下方式:

1
2
3
String[] parts = string.split("\\."); // 使用反斜杠转义
String[] parts = string.split("[.]"); // 使用字符类
String[] parts = string.split(Pattern.quote(".")); // 使用Pattern.quote()方法

2. 使用Pattern.compile(regexp).splitAsStream(input)

Java 8引入了Stream API,结合Pattern类可以实现流式分割字符串。

1
2
3
4
5
6
7
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

List<String> stringList = Pattern.compile("-")
.splitAsStream("004-034556")
.collect(Collectors.toList());

3. 使用StringTokenizer(不推荐)

StringTokenizer是一个遗留类,由于其设计和功能的局限性,在新代码中不建议使用。

1
2
3
4
5
6
7
import java.util.StringTokenizer;

StringTokenizer strings = new StringTokenizer("Welcome to EXPLAINJAVA.COM!", ".");
while (strings.hasMoreTokens()) {
String substring = strings.nextToken();
System.out.println(substring);
}

4. 使用Google Guava的Splitter

Guava是Google提供的一个强大的Java库,Splitter类可以方便地进行字符串分割,并且支持链式操作。

1
2
3
4
5
6
7
8
import com.google.common.base.Splitter;
import java.util.List;

Iterable<String> result = Splitter.on('-')
.trimResults()
.omitEmptyStrings()
.split("004-034556");
List<String> list = (List<String>) result;

5. 使用Apache Commons的StringUtils

Apache Commons Lang是一个常用的Java工具库,StringUtils类提供了方便的字符串处理方法。

1
2
3
4
import org.apache.commons.lang3.StringUtils;

String str = "004-034556";
String[] split = StringUtils.split(str, "-");

6. 自定义分割方法

可以根据需求自定义字符串分割方法,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.List;

public class SplitTest {
public static String[] split(String text, String delimiter) {
java.util.List<String> parts = new java.util.ArrayList<String>();

text += delimiter;

for (int i = text.indexOf(delimiter), j = 0; i != -1; ) {
String temp = text.substring(j, i);
if (temp.trim().length() != 0) {
parts.add(temp);
}
j = i + delimiter.length();
i = text.indexOf(delimiter, j);
}

return parts.toArray(new String[0]);
}

public static void main(String[] args) {
String str = "004-034556";
String delimiter = "-";
String result[] = split(str, delimiter);
for (String s : result)
System.out.println(s);
}
}

核心代码

以下是几种常见分割方法的核心代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 使用String.split()
String[] parts = "10,20".split(",");

// 使用Pattern.compile(regexp).splitAsStream(input)
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

List<String> strings = Pattern.compile("\\|")
.splitAsStream("010|020202")
.collect(Collectors.toList());

// 使用Google Guava的Splitter类
import com.google.common.base.Splitter;
import java.util.List;

Iterable<String> result = Splitter.on(',').split("1,2,3,4");
List<String> list = (List<String>) result;

// 使用Apache Commons的StringUtils类
import org.apache.commons.lang3.StringUtils;

String[] split = StringUtils.split("1,2,3,4", ",");

最佳实践

  • 简单分割:如果分隔符是单个非正则特殊字符,且对性能要求不高,使用String.split()方法。
1
String[] results = input.split(",");
  • 复杂分隔符和高性能要求:如果分隔符是复杂的正则表达式,且对性能有较高要求,使用Pattern.split()并预编译模式。
1
2
3
4
5
import java.util.regex.Pattern;

// 预编译模式
Pattern pattern = Pattern.compile("[,;:]");
String[] results = pattern.split(input);
  • 链式操作和特殊处理:如果需要进行链式操作或特殊处理,如去除空字符串、去除首尾空格等,使用Google Guava的Splitter类。
1
2
3
4
5
6
7
import com.google.common.base.Splitter;
import java.util.List;

List<String> list = (List<String>) Splitter.on('-')
.trimResults()
.omitEmptyStrings()
.split("004-034556");

常见问题

1. 正则表达式特殊字符问题

split()方法的参数是正则表达式,需要对特殊字符进行转义。例如,点(.)在正则表达式中表示任意字符,需要使用\\.[.]Pattern.quote(".")进行处理。

2. StringTokenizer的局限性

StringTokenizer是遗留类,不支持正则表达式,并且在处理连续分隔符时可能会产生意外结果,不建议在新代码中使用。

3. Java 8中split()方法的变化

Java 8中split()方法会移除结果数组开头的空字符串。例如:

1
2
String[] sampleTokensAgain = "004".split("");
System.out.println(java.util.Arrays.toString(sampleTokensAgain));

在Java 8中输出为[0, 0, 4],而在Java 7及之前版本可能输出为[, 0, 0, 4]