Java 1.11环境下正则表达式如何删除两个非空格字符之间的空格?
Java 11 场景下的空格清理实现方案
先梳理之前正则失效的核心原因
你的需求边界非常清晰:只删除夹在两个非空格字符之间的单个空格,所有连续2个及以上的空格分隔效果必须原样保留。之前你尝试的正则全部跑不通,本质是踩了Java正则的字符组使用误区:
- 正则字符组
[]内部的所有内容都是“单个待匹配的字符集合”,在字符组里写重复量词、分组括号都不会生效。比如你之前写的[^A-Z {3}],实际匹配逻辑是“匹配所有不是大写字母、不是空格、不是左大括号、不是数字3、不是右大括号的字符”,和你想表达的“匹配3个空格”的逻辑完全无关,自然出不来预期效果。
可直接复用的实现方案
Java 11 对零宽断言的支持完全成熟,用「前后置零宽断言」就能精准锁定要删除的目标空格,完全不会误伤连续多空格的排版:
匹配逻辑非常简单:
- 仅定位“前面是一个非空格字符、后面紧接的也是一个非空格字符”的单个空格,将这个空格替换为空
- 连续多空格的场景下,两个非空格字符之间夹的空格数≥2,每个空格位置至少有一侧是空格,根本不会被规则命中,原排版效果自然完整保留
对应的正则表达式为:(?<=\\S) (?=\\S)
可直接运行的Java代码示例
public class SpaceCleanDemo { public static void main(String[] args) { // 题目给出的示例输入 String input = "PATRICK GOOD MAN"; // 执行核心替换逻辑 String output = input.replaceAll("(?<=\\S) (?=\\S)", ""); // 控制台输出:PATRICK GOODMAN,和期望效果完全一致 System.out.println(output); } }
实际效果校验
拿几个高频场景验证匹配精度:
- 输入
PATRICK GOOD MAN→ 输出PATRICK GOODMAN(3个连续空格完整保留,GOOD和MAN之间的单空格被删除) - 输入
HELLO WORLD TEST→ 输出HELLO WORLDTEST(2个连续空格完整保留,WORLD和TEST之间的单空格被删除) - 输入
A B C D→ 输出AB C D(仅A和B之间的单空格被删除,C前后的单空格、D前面的3个空格全部原样保留)
注:如果你的业务场景里“非空格”的判定范围有更严格的要求(比如不算制表符、换行符这类其他空白字符),只需要把正则里的
\S替换成对应的字符集合即可,适配成本极低。
内容的提问来源于stack exchange,提问作者ThrowsError
相关产品推荐
相关产品推荐

