“帮帮我,我无法分割字符串!”——一个问题的故事
\n\n想象一下:你在用 Java 编写日志解析器、处理 CSV 文件,或者只是想将用户输入拆分成单词。然后——卡住了。该怎么做?如果你曾经搜索过“How do I split a string in Java”,你就会知道:这个问题在 Stack Overflow 上积累了数十万次浏览。不是因为 Java 程序员懒惰,而是因为 split() 功能强大,但暗藏陷阱。
\n\n在本文中,我们将从头到尾讲解 Java 中的字符串分割。你将了解 split() 方法的工作原理、正则表达式会带来哪些惊喜,以及如何避免每个新手都会遇到的陷阱。开始吧!
split() 方法:你的主要工具
\n\nJava 中的 String 类提供了两个重载版本的 split() 方法:
public String[] split(String regex)\npublic String[] split(String regex, int limit)\n\n第一个版本接受一个正则表达式并返回一个字符串数组。第二个版本功能相同,但增加了对结果部分数量的限制。听起来很简单?让我们看一些示例。
\n\n基本示例:按空格分割
\n\npublic class SplitExample {\n public static void main(String[] args) {\n String text = "Java 分割字符串很容易";\n String[] words = text.split(" ");\n \n for (String word : words) {\n System.out.println(word);\n }\n }\n}\n\n输出:
\nJava\n分割\n字符串\n很容易\n\n有效吗?有效。但是,如果有多个连续的空格呢?那么数组中会出现空字符串。这很烦人,对吧?
\n\n在 Java 中按逗号分割字符串(CSV)
\n\n最常见的任务之一就是 在 Java 中按逗号分割字符串。假设你有一个 CSV 字符串:
\n\nString csv = "苹果,梨,香蕉,橙子";\nString[] fruits = csv.split(",");\n\nfor (String fruit : fruits) {\n System.out.println(fruit.trim()); // trim() 去除多余空格\n}\n\n输出:
\n苹果\n梨\n香蕉\n橙子\n\n注意:我们添加了 trim(),因为在真实数据中,逗号后面经常有空格。如果不这样做,你会得到带有前导空格的 " 苹果",然后你会困惑为什么字符串不匹配。
正则表达式:魔法与痛苦
\n\nsplit() 方法接受一个正则表达式。这提供了极大的灵活性,但也需要小心谨慎。让我们看看常见的场景。
按点号分割
\n\n想要拆分 IP 地址 "192.168.1.1"?简单的代码 str.split(".") 不会生效。为什么?因为点号在正则表达式中是一个特殊字符,表示“任意字符”。结果你会得到一个空字符串数组。
正确的解决方案是转义点号:
\n\nString ip = "192.168.1.1";\nString[] parts = ip.split("\\\\."); // 双反斜杠!\n\nfor (String part : parts) {\n System.out.println(part);\n}\n// 输出:192 168 1 1\n\n记住:在 Java 中,正则表达式中转义需要使用双反斜杠 \\\\。单个 \\ 是字符串的转义字符,而双反斜杠才是用于正则表达式的。
按多个分隔符分割
\n\n如果字符串同时包含逗号、分号和空格怎么办?使用方括号内的字符类:
\n\nString messy = "苹果;梨,香蕉 橙子";\nString[] items = messy.split("[;,\\\\s]+"); // ; 或 , 或空白字符\n\nfor (String item : items) {\n System.out.println(item);\n}\n// 输出:苹果 梨 香蕉 橙子\n\n符号 + 表示“一个或多个”——这确保分隔符序列不会