java 怎么分割字符串
- 后端开发
- 2025-08-03
- 3976
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(".")
,因为后者会被解释为“任意单个字符”,同理,竖线也需要转义为`