Java中如何分割字符串
技术背景
在Java编程中,字符串分割是一个常见的操作。例如,当处理用户输入、解析文件内容或处理网络数据时,经常需要将一个字符串按照特定的分隔符拆分成多个子字符串。Java提供了多种方法来实现字符串分割,每种方法都有其特点和适用场景。
实现步骤
1. 使用String.split()
方法
String.split()
方法是最常用的字符串分割方法,它接受一个正则表达式作为分隔符。
1 2 3 4
| String string = "004-034556"; String[] parts = string.split("-"); String part1 = parts[0]; String part2 = parts[1];
|
需要注意的是,split()
方法的参数被视为正则表达式,因此如果分隔符是正则表达式的特殊字符,需要进行转义。例如,要按点(.
)分割字符串,可以使用以下方式:
1 2 3
| String[] parts = string.split("\\."); String[] parts = string.split("[.]"); String[] parts = string.split(Pattern.quote("."));
|
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[] parts = "10,20".split(",");
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());
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;
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]
。