Character.isWhitespace() 不能用于正则表达式中清理控制字符,因其仅判断单个字符是否为空白(如空格、换行等),不识别 u0000–u001F 等需清除的 Unicode 控制符;推荐直接用 replaceAll("\p{Cntrl}", "") 或更精确范围 [u0000-u001Fu007F]。

不能直接用 Character.isWhitespace() 配合正则“一次性”清理控制字符,因为二者作用对象和语义不同:前者判断单个字符是否为空白(如空格、制表符、换行符等),后者匹配的是 Unicode 控制字符(p{Cntrl})或特定范围(如 [u0000-u001Fu007F])。而 Character.isWhitespace() 本身不是正则表达式工具,也不能嵌入正则中使用。
明确目标:清理哪些字符?
所谓“控制字符”,通常指 Unicode 类别为 Cc(Control)的字符,包括:
- ASCII 控制符:
u0000–u001F(如u0007响铃、u001BESC)、u007F(DEL) - 某些 Unicode 补充控制符(如 U+2028 行分隔符、U+2029 段落分隔符,但注意:它们 不属于
isWhitespace()判定范围)
Character.isWhitespace(c) 只返回 true 对于公认的“空白”字符(如 ' '、' '、'
'、'
'、''、U+0085、U+2000–U+200A 等),它不认为 u0000、u0001 等是空白——这些才是典型需清理的“隐藏控制字符”。
推荐做法:用正则直接匹配并替换控制字符
最简洁可靠的方式是使用正则表达式 "\p{Cntrl}"(匹配所有 Unicode 控制字符):
立即学习“Java免费学习笔记(深入)”;
String clean = text.replaceAll("\p{Cntrl}", "");
如果只要 ASCII 控制字符(更常见且安全),用范围更明确的写法:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
String clean = text.replaceAll("[\u0000-\u001F\u007F]", "");
注意:u0020(空格)不在该范围内,所以不会误删正常空格; (u0009)、
(u000A)、
(u000D)在 u0000-u001F 内,会被删除。若你希望保留制表符、换行等“有意义的空白”,就不要用这个范围,而应显式排除:
// 仅删纯控制符,保留
u0085 等 isWhitespace 认可的空白
String clean = text.replaceAll("[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]", "");
若坚持结合 isWhitespace():只能手写遍历
如果业务逻辑确实需要“只保留 isWhitespace 认可的空白,其余全删”,那就无法靠正则一步到位,需遍历字符筛选:
StringBuilder sb = new StringBuilder();
for (char c : text.toCharArray()) {
if (Character.isWhitespace(c) || !Character.isISOControl(c)) {
// 保留所有空白 + 所有非控制字符(即删掉 isISOControl 且非 isWhitespace 的)
sb.append(c);
}
}
String clean = sb.toString();
但更清晰的逻辑是反向:只保留“非控制字符”或“被 isWhitespace 认可的控制字符”:
StringBuilder sb = new StringBuilder();
for (char c : text.toCharArray()) {
if (!Character.isISOControl(c) || Character.isWhitespace(c)) {
sb.append(c);
}
}
String clean = sb.toString();
额外提醒:注意不可见但非控制的字符
有些字符虽不可见,却不属于控制字符,例如:
-
u200B(零宽空格)、uFEFF(BOM)、u2060(字词连接符)——属于 Unicode 格式字符(p{Cf}) - 若需一并清理,正则可扩展为:
"[\p{Cntrl}\p{Cf}]"
Java 1.7+ 支持 p{Cntrl} 和 p{Cf},组合使用即可覆盖大部分干扰性不可见字符。

















