
本文介绍使用正则表达式精准识别并移除 Java 字符串中“字符间冗余空格”(如 "H i , I ' a m" → "Hi, I'am")的实用方法,涵盖两步替换逻辑、完整示例代码及关键注意事项。
本文介绍使用正则表达式精准识别并移除 java 字符串中“字符间冗余空格”(如 `"h i , i ' a m"` → `"hi, i'am"`)的实用方法,涵盖两步替换逻辑、完整示例代码及关键注意事项。
在实际开发中,尤其处理 OCR 输出、老旧文本文件或异常编码数据时,常遇到字符串中每个字符后被强制插入空格的问题(例如 "H i , I ' a m")。这种格式并非标准单词分隔,而是所有相邻可见字符之间均夹杂一个或多个空格,导致语义断裂、格式错乱。单纯调用 trim() 或 replaceAll("\s+", " ") 无法解决——前者仅去首尾空格,后者会将单词内本应保留的单空格(如 "Hi, I'am" 中的逗号后空格)也错误压缩。
正确的思路是:先恢复单词内部结构,再规范化词间空格。这需分两步完成:
消除“字符+空格+非空格字符”模式中的冗余空格
使用正则 "( [^ ]+)" 匹配「一个空格 + 后续至少一个非空格字符」,并用捕获组 $1(即后续非空格字符部分)替换整个匹配项。该操作实质是删除所有紧邻非空格字符之前的空格,从而将 "H i" → "Hi"、"I ' a" → "I'a"(注意:此时 ' 后空格也被删,需后续修复)。修复因第一步导致的标点粘连,并统一词间空格
第一步可能使标点(如 ', ,, .)与前后字母紧贴(如 "I'am" 正确,但 "Hi," 变成 "Hi," 本身无问题;而 "1 :" 会变成 "1:",需保留冒号前空格)。因此第二步采用 replaceAll("[ ]{2,}", " ") 将两个及以上连续空格压缩为单个空格,既保留合法词间距,又清理残余多空格。
以下是完整、可直接运行的工具方法:
public static String cleanString(String input) {
if (input == null) return null;
// Step 1: Remove space before any non-space character
String step1 = input.replaceAll(" ([^ ]+)", "$1");
// Step 2: Normalize multiple consecutive spaces to single space
return step1.replaceAll(" {2,}", " ");
}
// 使用示例
public static void main(String[] args) {
String oldString = "1 : H i , I ' a m a S t r i n g .";
String cleaned = cleanString(oldString);
System.out.println(cleaned); // 输出: "1 : Hi, I'am a String."
}
✅ 关键注意事项:
- 该方案假设“冗余空格”严格出现在可见字符之间,且原始文本中单词内部本无空格(如 "Hello World" 不会被误处理为 "HelloWorld");
- 若输入含制表符( )、换行符( )等广义空白,需将正则中的空格 ` 替换为s,但需同步调整逻辑(如"(s+[^s]+)"`),否则可能误删换行;
- 对于含 Unicode 字符(如中文、emoji)的字符串,[^ ] 仍有效(它匹配“非空格字符”,包含所有 Unicode 字符),无需额外修改;
- 性能敏感场景可预编译 Pattern 提升效率,但对普通文本处理影响甚微。
总结而言,此两步正则法以最小侵入性还原语义结构:先“缝合”被空格割裂的单词与符号,再“梳理”词间空白,兼顾准确性与可读性,是处理此类畸形字符串的稳健实践方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











