
本文详解如何使用正则表达式优化 String.split() 以消除连续空格,正确分割单词,并构建无冗余空格的逆序句子。
本文详解如何使用正则表达式优化 `string.split()` 以消除连续空格,正确分割单词,并构建无冗余空格的逆序句子。
在处理自然语言文本时,原始字符串常包含多个连续空格(如 "a good example"),若直接用 split(" ") 分割,会生成包含空字符串的数组(如 ["a", "good", "", "", "example"]),导致后续逆序拼接时出现多余空格或逻辑错误。
根本原因在于:String.split(String regex) 的参数是正则表达式,而非普通字符串。" " 仅匹配单个空格;而 " +"(空格后跟 + 量词)表示“匹配一个或多个连续空格”,从而将任意长度的空白间隙视为单一分隔符,确保每个有效单词独立成项。
✅ 正确做法:将 s.split(" ") 替换为 s.split(" +")
此外,还可进一步增强健壮性,使用 s+ 匹配所有空白字符(包括制表符、换行符等):
String[] arr = s.trim().split("\s+");
⚠️ 注意:s+ 中的双反斜杠是 Java 字符串转义要求(s 是正则中的空白符,需写成 "s");同时调用 trim() 可预先清除首尾空白,避免数组首尾产生空字符串。
Java Linux版下载Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
以下是优化后的完整实现(含注释与关键改进):
import java.util.Arrays;
public class ReverseString {
public static void main(String[] args) {
String s = "a good example";
System.out.println(revString(s)); // 输出:example good a
}
static String revString(String s) {
if (s == null || s.trim().isEmpty()) {
return "";
}
// 使用 \s+ 精确分割:跳过所有连续空白,且自动忽略首尾空白
String[] words = s.trim().split("\s+");
StringBuilder result = new StringBuilder();
// 从末尾向前遍历,逐个追加单词 + 单个空格
for (int i = words.length - 1; i >= 0; i--) {
if (!words[i].isEmpty()) { // 额外防护(虽经 split 已基本保证非空)
result.append(words[i]);
if (i > 0) {
result.append(" ");
}
}
}
return result.toString();
}
}
? 进阶建议:
- 若需更高性能或更简洁代码,可结合 Collections.reverse() 与 String.join():
List<string> list = Arrays.asList(s.trim().split("\s+")); Collections.reverse(list); return String.join(" ", list);</string> - 对于严格格式控制(如保留原缩进结构),应改用 Pattern.compile("\s+").splitAsStream(...) 流式处理。
总结:解决多空格问题的核心是理解 split() 的正则本质——用 " +" 或 "\s+" 替代 " ",配合 trim() 预处理,即可干净、可靠地提取单词数组,为逆序、过滤、重组等操作奠定坚实基础。











