trim()方法是否会移除CRLF字符?该行为是否为预期设计?
没错,这完全是Java
trim() 方法的预期设计 首先可以明确:你观察到的trim()移除CRLF(回车\r、换行\n)的行为,完全符合这个方法的设计逻辑。
为什么会这样?
Java官方文档对String.trim()的定义是:返回一个新字符串,移除原字符串所有的前导和尾随空白字符。这里的「空白字符」可不是仅指空格,而是涵盖了Unicode标准中所有被归类为“空白”的字符,其中就包括:
- 空格(
) - 制表符(
\t) - 回车符(
\r) - 换行符(
\n) - 换页符(
\f)等其他空白类字符
结合你的代码示例来看
你写的这段代码:
String s = "str\r\n"; s = s.trim(); System.out.println("--"); System.out.print(s); System.out.println("--");
调用trim()后,字符串尾部的\r\n会被彻底移除,所以最终输出的--之间只会显示str,不会有换行,这完全是方法设计时就确定的行为。
如果想保留换行符,只移除空格怎么办?
如果你的需求是仅移除首尾的空格,而保留回车、换行这类换行符,可以用正则表达式自定义处理逻辑:
String s = "str\r\n"; // 只移除首尾的空格(不影响\r\n) s = s.replaceAll("^[ ]+|[ ]+$", ""); System.out.println("--"); System.out.print(s); System.out.println("--");
这样处理后,尾部的\r\n会被保留,输出时str后面会正常换行。
另外要注意,Java 11及以后新增的stripLeading()、stripTrailing()方法,和trim()的逻辑类似,也是移除所有Unicode空白字符,同样会去掉CRLF,使用时要根据需求选择。
内容的提问来源于stack exchange,提问作者Ernestas Gruodis
相关产品推荐
相关产品推荐

