java 怎么分割字符串
- 后端开发
- 2025-08-03
- 3993
split()方法按正则表达式分割字符串,如
str.split(",")以逗号为分隔符分割。
Java中,字符串分割是一个常见且重要的操作,适用于多种场景如解析CSV文件、处理网络请求参数等,以下是几种常用的方法及其详细实现方式:
| 方法名称 | 所属类/工具包 | 主要特点 | 适用场景示例 |
|---|---|---|---|
split() |
String类 |
基于正则表达式拆分,返回数组;支持限制分割次数 | 简单分隔符(如逗号、空格)、快速拆分 |
StringTokenizer |
Java标准库 | 迭代式解析,可指定多个分隔符;较老旧,不推荐新代码使用 | 兼容旧系统的维护项目 |
Pattern与Matcher |
java.util.regex包 |
强大的正则引擎,支持复杂逻辑(如保留分隔符、捕获组) | 需要精确控制或高级匹配的情况 |
Guava的Splitter |
Google核心库 | 语义化API设计,链式调用友好;提供固定长度分块等功能 | 现代项目推荐使用的高效工具 |
Apache Commons的StringUtils |
第三方库 | 自动处理null输入,异常安全;封装了底层细节 |
企业级应用开发 |
具体用法详解
String.split()方法
这是最基础也最常用的方式,其本质是通过正则表达式进行模式匹配。
String str = "apple,banana,orange";
String[] fruits = str.split(",\s"); // 以逗号+任意数量空格为分隔符
注意点:若分隔符本身是特殊字符(如点号),需用反斜杠转义(写成
\.);或者采用字符类形式[.];还可以使用Pattern.quote()方法自动转义,该方法第二个参数可控制最大分割次数,避免过度拆解导致数组越界问题,例如split("-", 2)只会将字符串分成两部分。
StringTokenizer类
尽管属于遗留API,但在部分存量系统中仍可见到它的身影,典型用法如下:
StringTokenizer tokenizer = new StringTokenizer("key1=value1&key2=value2", "&");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken()); // 依次输出key1=value1和key2=value2
}
局限性:无法直接获取原始分隔符内容,且不支持正则表达式,灵活性较差,建议仅用于兼容性维护场景。
正则表达式进阶应用(Pattern/Matcher)
当需求超出简单拆分时,可以利用Java完整的正则体系实现复杂功能,例如保留分隔符的位置信息:
Pattern pattern = Pattern.compile("(?<=\G.{3})"); // 每3个字符切分一次
Matcher matcher = pattern.matcher("abcdefghijklmnop");
List<String> chunks = new ArrayList<>();
while (matcher.find()) {
chunks.add(matcher.group());
}
// 结果将是["abc", "def", "ghi", "jkl", "mno", "p"]
技巧:通过零宽断言
(?<=...)实现非消耗性匹配,确保分隔符不被丢弃,此方案适合需要精确控制截取长度的场景。
Guava库的Splitter工具
对于追求代码可读性的开发者而言,Guava提供的Splitter是理想选择:
Iterable<String> parts = Splitter.on(",").trimResults().omitEmptyStrings().split(" a,b,c , d ");
// 自动去除首尾空白并忽略空元素,得到[a, b, c, d]
优势:链式调用清晰表达意图,内置对多余空格、空字符串的处理逻辑,减少手动校验工作量,特别适合处理用户输入等不规范数据。
Apache Commons Lang的StringUtils
该组件对异常情况进行了良好封装:
String[] arr = StringUtils.split("not,an,empty,string", ","); // 即使输入为null也不会抛出异常
设计哲学:优先保障程序健壮性,自动过滤无效输入,适合作为通用工具方法集成到框架层面。
性能对比与选型建议
| 维度 | split() |
StringTokenizer |
Pattern/Matcher |
Guava Splitter | StringUtils |
|---|---|---|---|---|---|
| 执行速度 | 快 | 中等 | 慢 | 较快 | 中等 |
| API易用性 | 一般 | 较差 | 复杂 | 优秀 | 良好 |
| 功能扩展性 | 有限 | 极低 | 极强 | 较强 | 适中 |
| 内存占用 | 低 | 高(内部维护状态机) | 高(回溯机制影响) | 优化过 | 稳定 |
| 推荐指数 |
FAQs
Q1: 如果我要按多个不同的分隔符来拆分字符串怎么办?
A: 可以使用正则表达式中的“或”逻辑组合多个分隔符,例如[,;]表示以逗号或分号作为分隔符,或者使用Guava的Splitter.on(CharMatcher.anyOf(",;"))实现相同效果。
Q2: 为什么有时候用split()得到的数组长度比我预期的少?
A: 这是由于未转义的特殊字符导致的正则误解析,比如用点号做分隔符时,必须写成split("\.")而非split("."),因为后者会被解释为“任意单个字符”,同理,竖线也需要转义为`
