
本文详解如何使用 Java 的 String.split() 方法配合正则表达式(如 " +")一次性分割并清除连续空格,从而正确构建反转单词序列,避免因多空格导致的数组元素残留问题。
本文详解如何使用 java 的 `string.split()` 方法配合正则表达式(如 `" +"`)一次性分割并清除连续空格,从而正确构建反转单词序列,避免因多空格导致的数组元素残留问题。
在处理自然语言文本时,原始字符串常包含不规则的空白——例如多个连续空格、首尾空格或制表符。若直接用 split(" ")(按单个空格分割),Java 会将每处空格都视为分隔符,导致中间出现大量空字符串元素(如 "a good example" 分割后得到 ["a", "good", "", "", "example"]),进而干扰后续逻辑(如反转单词顺序)。
根本原因在于:String.split(String regex) 的参数是正则表达式,而非普通字符串。
" " 表示“匹配一个空格”,而 " +" 表示“匹配一个或多个连续空格”——这正是解决多空格问题的关键。该正则能将任意长度的空白块(包括 2 个、3 个甚至更多空格)统一视作单一分隔符,从而产出紧凑、无空元素的字符串数组。
以下是优化后的完整实现:
import java.util.ArrayList;
import java.util.List;
public class ReverseString {
public static void main(String[] args) {
String s = "a good example";
String ans = revString(s);
System.out.println(ans); // 输出:example good a
}
static String revString(String s) {
// ✅ 关键修复:使用正则 " +" 替代 " ",合并所有连续空格为单一分隔符
String[] arr = s.split(" +");
StringBuilder ans = new StringBuilder();
// 从后往前遍历,逐个追加单词 + 单个空格
for (int i = arr.length - 1; i >= 0; i--) {
// trim() 非必需(split(" +") 已确保无首尾空格),但保留更健壮
if (!arr[i].trim().isEmpty()) {
ans.append(arr[i].trim());
ans.append(" ");
}
}
// 移除末尾多余空格
return ans.toString().trim();
}
}
注意事项与最佳实践:
- ✅ 优先使用 split(" +") 或更通用的 split("\s+"):后者可同时处理空格、制表符、换行符等所有空白字符,适用性更强;
- ⚠️ 避免 if (arr[i] == null) 判空:split() 不会返回 null 元素,只可能产生空字符串 "",应改用 !arr[i].trim().isEmpty() 或 !arr[i].isEmpty();
- ? trim() 在 split(" +") 后非必须,但建议保留:增强对输入中潜在首尾空格的容错性;
- ? 进阶替代方案:JDK 8+ 可结合 Stream 简化逻辑:
return Arrays.stream(s.split("\s+")) .filter(word -> !word.isEmpty()) .reduce((w1, w2) -> w2 + " " + w1) .orElse("");
通过正则驱动的智能分割,我们不仅解决了多空格难题,更提升了代码的健壮性与可维护性——这是文本预处理中一项基础却至关重要的技能。











