我有一个字符串,希望仅使用Java将字符串末尾的换行符删除。
"foo\r\nbar\r\nhello\r\nworld\r\n"
我想成为这样的人
"foo\r\nbar\r\nhello\r\nworld"
这个问题与593671类似,但并不完全相同。
s = s.replaceAll("[\r\n]+$", "");
。这会删除字符串末尾的 \r
和 \n
字符。[\r\n]
是包含 \r
和 \n
的字符类
- +
表示匹配一次或多次
- $
是字符串结尾的定位符。
你也可以使用 String.trim()
去除字符串开头和结尾的任何空白字符:
s = s.trim();
如果你需要检查一个字符串是否只包含空格字符,你可以在使用 trim()
后检查它是否为空,具体实现可以参考 isEmpty()
。if (s.trim().isEmpty()) {
//...
}
或者你也可以检查它是否 matches("\\s*")
,即零个或多个空格字符。请注意,在Java中,正则表达式matches
尝试匹配整个字符串。在可以匹配子字符串的情况下,您需要锚定模式,因此为^\s*$
。
这里使用 String.trim 方法,是否能解决问题呢?
也就是说,在你的字符串上调用方法 .trim()
,它会返回一个去除了前导和尾随空格的字符串副本。
Apache Commons Lang提供了StringUtils.stripEnd(String str, String stripChars)
方法,可以实现该功能;例如:
String trimmed = StringUtils.stripEnd(someString, "\n\r");
String trimmed = StringUtils.stripEnd(someString, null);
大家都提供了使用正则表达式的方法,所以我将提供一种最快的方法:
public String replace(String val) {
for (int i=val.length()-1;i>=0;i--) {
char c = val.charAt(i);
if (c != '\n' && c != '\r') {
return val.substring(0, i+1);
}
}
return "";
}
基准测试显示,它的运行速度比正则表达式解决方案快约45倍。
charAt
而不是toCharArray()
来更快地完成。 - polygenelubricants如果您的项目中有 Google 的guava-libraries(如果没有的话,您应该考虑加入!),您可以使用CharMatcher来实现:
String result = CharMatcher.any("\r\n").trimTrailingFrom(input);
String text = "foo\r\nbar\r\nhello\r\nworld\r\n";
String result = text.replaceAll("[\r\n]+$", "");
"foo\r\nbar\r\nhello\r\nworld\r\n".replaceAll("\\s+$", "") 或者 "foo\r\nbar\r\nhello\r\nworld\r\n".replaceAll("[\r\n]+$", "")
trim()
也会删除前导空格,这不是被要求的。 - Jesper[ab]
与[ba]
相同,都匹配a
或b
的字符类。只有在定义范围时才需要注意顺序,例如[0-9]
而不是[9-0]
。[ab]
与ab
不同。 - polygenelubricants