从Java字符串末尾删除行尾字符

9
我有一个字符串,希望仅使用Java将字符串末尾的换行符删除。
"foo\r\nbar\r\nhello\r\nworld\r\n"

我想成为这样的人

"foo\r\nbar\r\nhello\r\nworld"

这个问题与593671类似,但并不完全相同。

7个回答

17
你可以使用 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*$

相关问题


第二个选项会保留任何前导空格吗? - Iain Sproat
2
trim() 也会删除前导空格,这不是被要求的。 - Jesper
@sprocket:你在谈论哪个第二个选项?此回复中的解决方案将保留前导空格。 - Joachim Sauer
@polygenelubricants 这个问题涉及到(就 Jesper 在另一个答案的评论中所问的)字符串结尾为 "\n\r" 而非 "\r\n" 的情况吗?还是只有没有 "\r" 的 "\n"? - Iain Sproat
@sprocketonline:是的,字符类是一个集合,即无序的。[ab][ba]相同,都匹配ab的字符类。只有在定义范围时才需要注意顺序,例如[0-9]而不是[9-0][ab]ab不同。 - polygenelubricants

3

这里使用 String.trim 方法,是否能解决问题呢?

也就是说,在你的字符串上调用方法 .trim(),它会返回一个去除了前导和尾随空格的字符串副本。


他明确表示:“……仅从字符串的末尾开始”,因此他不想删除前导空格。 - Jesper
是的,我知道。不过,这个示例字符串没有前导空格,所以我想试一试... - Richard Walton

2

Apache Commons Lang提供了StringUtils.stripEnd(String str, String stripChars)方法,可以实现该功能;例如:

    String trimmed = StringUtils.stripEnd(someString, "\n\r");

如果您想要移除字符串末尾的所有空格:
    String trimmed = StringUtils.stripEnd(someString, null);

2

大家都提供了使用正则表达式的方法,所以我将提供一种最快的方法:

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
@polygenelubricants:确实。检查了Java源代码,你是对的。不知怎么回事,我以为toCharArray只返回字符串的内部值。但在查看Java源代码后,我发现它将数组复制到一个新的数组中。我也要改变我的答案。 - bezmax

2

如果您的项目中有 Google 的guava-libraries(如果没有的话,您应该考虑加入!),您可以使用CharMatcher来实现:

String result = CharMatcher.any("\r\n").trimTrailingFrom(input);

1
String text = "foo\r\nbar\r\nhello\r\nworld\r\n";
String result = text.replaceAll("[\r\n]+$", "");

0
"foo\r\nbar\r\nhello\r\nworld\r\n".replaceAll("\\s+$", "")
或者
"foo\r\nbar\r\nhello\r\nworld\r\n".replaceAll("[\r\n]+$", "")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接