如何恢复使用.trim()去除的字符串原始首尾空格?
如何恢复trim()后的原始带首尾空格字符串?
嘿,这个问题的核心其实很直白:当你调用trim()方法时,字符串首尾的空白字符(包括空格、制表符这些)已经被永久丢弃了——Java的trim()不会帮你记录这些被删掉的内容,所以单靠trim后的字符串本身,是没办法直接还原回原始状态的。
不过我们可以通过提前做一些处理来实现“恢复”的需求,下面给你两个可行的方案:
方案1:提前保存原始字符串
这是最简单直接的办法——别把trim后的结果覆盖原始变量,而是用新变量存处理后的版本,原始字符串留着备用:
// 保存原始字符串 String original = " apple "; // 用新变量存trim后的结果 String trimmed = original.trim(); // 验证trim结果 assert trimmed.equals("apple"); // 需要恢复的时候直接用原始字符串就行 assert original.equals(" apple ");
这个方案的优势是零额外逻辑,只要你不覆盖原始变量,随时都能拿到带空格的版本。
方案2:记录首尾空白字符数量再拼接
如果必须要先trim,之后再恢复,那你需要在trim之前先记录首尾空白的数量,后续再把这些空白拼接回去。比如可以写个简单的工具类来封装这个逻辑:
public class TrimRestoreHelper { private final String trimmedString; private final int leadingWhitespaceCount; private final int trailingWhitespaceCount; public TrimRestoreHelper(String original) { // 计算开头的空白字符数量 int leading = 0; while (leading < original.length() && Character.isWhitespace(original.charAt(leading))) { leading++; } // 计算结尾的空白字符数量 int trailing = 0; int contentEndIndex = original.length() - 1; while (trailing < original.length() - leading && Character.isWhitespace(original.charAt(contentEndIndex - trailing))) { trailing++; } this.trimmedString = original.substring(leading, original.length() - trailing); this.leadingWhitespaceCount = leading; this.trailingWhitespaceCount = trailing; } // 获取trim后的字符串 public String getTrimmed() { return trimmedString; } // 恢复原始格式的字符串 public String restore() { StringBuilder result = new StringBuilder(); // 添加上开头的空白 result.append(" ".repeat(leadingWhitespaceCount)); result.append(trimmedString); // 添加结尾的空白 result.append(" ".repeat(trailingWhitespaceCount)); return result.toString(); } }
使用示例:
String original = " apple "; TrimRestoreHelper helper = new TrimRestoreHelper(original); String trimmed = helper.getTrimmed(); assert trimmed.equals("apple"); // 恢复原始字符串 String restored = helper.restore(); assert restored.equals(" apple ");
如果只需要处理普通空格(不需要处理制表符、换行符这类空白),可以把Character.isWhitespace换成original.charAt(...) == ' '来精确匹配。
⚠️ 重要提醒:如果已经执行了a = a.trim()把原始字符串覆盖了,而且之前没有任何地方保存过原始内容,那完全无法恢复——因为trim后的字符串没有任何关于原始首尾空格的信息,就像你剪掉了纸张的边缘,没法从剩下的部分还原剪掉的部分一样。
内容的提问来源于stack exchange,提问作者Blue Holliday
相关产品推荐
相关产品推荐

