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

Posted

技术标签:

【中文标题】从 Java 字符串的末尾删除行尾字符【英文标题】:Remove end of line characters from end of Java String 【发布时间】:2011-03-07 05:56:31 【问题描述】:

我有一个字符串,我想仅使用 Java 从字符串的最末尾删除行尾字符

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

我想成为什么样的人

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

(此问题与问题593671相似但不同)

【问题讨论】:

【参考方案1】:

您可以使用s = s.replaceAll("[\r\n]+$", "");。这会修剪字符串末尾的 \r\n 字符

正则表达式解释如下:

[\r\n] 是一个包含 \r\n 的字符类 + 是一个或多个重复 $ 是字符串的结尾锚

参考文献

regular-expressions.info/Anchors, Character Class, Repetition

相关主题

您还可以使用String.trim() 修剪字符串开头结尾中的任何个空白字符:

s = s.trim();

如果您需要检查String 是否只包含空白字符,您可以在trim() 之后检查isEmpty()

if (s.trim().isEmpty()) 
   //...

或者,您还可以查看它是否为matches("\\s*"),即零个或多个空白字符。请注意,在 Java 中,正则表达式 matches 尝试匹配 整个 字符串。在可以匹配子字符串的风味中,您需要锚定模式,因此它是^\s*$

相关问题

regex, check if a line is blank or not how to replace 2 or more spaces with single space in string and delete leading spaces only

【讨论】:

而第二个选项会留下任何前导空格? trim() 也会删除前导空格,这不是被要求的。 @sprocket:你说的是第二个选项?此回复中的解决方案将保留前导空格。 @polygenelubricants 是否处理(正如 Jesper 在对另一个答案的评论中所问的那样)字符串以“\n\r”而不是“\r\n”结尾或仅“ \n" 没有"\r"? @sprocketonline:是的,字符类是一个集合,即无序。 [ab][ba] 相同,是匹配ab 的字符类。仅当您定义范围时,顺序才重要,即[0-9],而不是[9-0][ab]ab 不同。【参考方案2】:

String.trim 不会在这里解决问题吗?

也就是说,你会在你的字符串上调用 .trim() 方法,它应该返回该字符串的副本减去任何前导或尾随空格。

【讨论】:

他明确地说:“......仅从字符串的末尾开始”,所以他不想删除前导空格。 是的,我知道。尽管如此,示例字符串没有任何前导空格,所以我认为值得一试......【参考方案3】:

Apache Commons Lang StringUtils.stripEnd(String str, String stripChars) 可以解决问题;例如

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

如果要删除字符串末尾的 all 空格:

    String trimmed = StringUtils.stripEnd(someString, null);

【讨论】:

【参考方案4】:

好吧,每个人都给出了一些使用正则表达式的方法,所以我将给出一个最快的方法来代替:

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 "";

Benchmark 表示它的运行速度比正则表达式解决方案快约 45 倍。

【讨论】:

我认为不使用toCharArray() 可以更快地使用charAt @polygenelubricants:确实。检查java源代码,你是对的。不知何故,我认为 toCharArray 只是返回字符串的内部值。但是在查看了 java 的源代码后,我发现它会将数组复制到一个新的数组中。我也会改变答案。【参考方案5】:

如果您的项目中有 Google 的 guava-libraries(如果没有,您可以说应该!),您可以使用 CharMatcher:

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

【讨论】:

【参考方案6】:
String text = "foo\r\nbar\r\nhello\r\nworld\r\n";
String result = text.replaceAll("[\r\n]+$", "");

【讨论】:

【参考方案7】: "foo\r\nbar\r\n你好\r\nworld\r\n".replaceAll("\\s+$", "") 要么 "foo\r\nbar\r\nhello\r\nworld\r\n".replaceAll("[\r\n]+$", "")

【讨论】:

以上是关于从 Java 字符串的末尾删除行尾字符的主要内容,如果未能解决你的问题,请参考以下文章

vim操作总结

Linux vim简单操作命令

Java删除开头和末尾字符串

从字符串中间删除特定文本(仅从字符串末尾第一次出现)

如何从列表中的字符串末尾删除 '\n'? [复制]

如何从字符串末尾删除子字符串?