striptrailing()仅移除末尾unicode空白,开头缩进因不在末尾而完整保留;它基于character.iswhitespace()识别空格、制表符、换行符、回车符及u2000、u0085等unicode空白,不触碰字符串开头和中间内容。

String.stripTrailing() 正是为此设计的:它只移除字符串末尾的 Unicode 空白字符(如空格、制表符、换行符等),完全不影响开头和中间的空白,包括代码缩进。
它如何保留开头缩进?
Java 的 stripTrailing() 内部从字符串末尾向前扫描,遇到第一个非空白字符就停止,并截断其后的所有空白。开头缩进属于“非末尾”部分,自然原封不动。
例如:
String code = " int x = 1;
";
System.out.println("[" + code.stripTrailing() + "]");
// 输出:[ int x = 1;]
开头的 4 个空格(缩进)完整保留,末尾的换行、制表、回车、空格全被清除。
哪些字符会被 stripTrailing() 移除?
它识别所有 Character.isWhitespace(ch) == true 的 Unicode 空白符,包括:
- 普通空格
' ' - 水平制表符
' ' - 换行符
' '、回车符' '、换行回车组合 - Unicode 空白如
'u2000'(空格块)、'u0085'(下一行符)等
对比其他方法,为什么不用 trim() 或 strip()?
它们会破坏缩进:
-
trim():仅处理 ASCII 空格和制表/换行,且两端都删 -
strip():Unicode 感知,但也是两端同时去除,开头缩进会丢失 -
stripTrailing():Unicode 感知 + 仅尾部 → 安全保留缩进
实际写代码时的小提醒
确保使用 Java 11+(该方法自 JDK 11 引入);如果需兼容旧版本,可用正则替代:
// 等效于 stripTrailing()(Java 8+ 可用)
str.replaceAll("\s+$", "")
但注意:s 在正则中默认不匹配所有 Unicode 空白(如某些 Unicode 分隔符),严格等价推荐用 (?U)\s+$ 或直接升级到 JDK 11+ 用原生方法。











