如何从字符串的开头和结尾删除换行符?

174

我有一个字符串,其中包含一些文本,后面跟着一个空行。如何最好地保留文本部分,但删除末尾的换行符空格?


4
不是的。链接中的问题是在询问“替换”,而不是其他。 - Faiz
12个回答

365

使用String.trim()方法来去除字符串开头和结尾的空格(空格、换行等)。

String trimmedString = myString.trim();

38
问题涉及换行符。这将删除不仅仅是换行符。 - mjs

30
String.replaceAll("[\n\r]", "");

30
兄弟,@JohnB,这将删除字符串之间的所有换行符。要求仅删除前导和尾随的换行符。 - Siddhartha

26

这段Java代码完全符合问题标题中所要求的内容:"从Java字符串的开头和结尾删除换行符":

String.replaceAll("^[\n\r]", "").replaceAll("[\n\r]$", "")

仅从行末删除换行符:

String.replaceAll("[\n\r]$", "")

仅从行开头删除换行符:

String.replaceAll("^[\n\r]", "")

你能提供额外的上下文来解释你的答案吗?这样每个人都可以理解你的代码是做什么的以及为什么这样写。 - Mariano Zorrilla
我已经在我的回答中添加了解释。希望现在清楚了。 - Alexander Samoylov
1
这是正确的解决方案,因为它仅删除换行符,而不是空格、制表符或其他空白字符。 - Not Saying

11

简述

String cleanString = dirtyString.strip() ; // Call new `String::string` method.

String::strip…

旧的String::trim方法对于空白字符有一个奇怪的定义

这里所述,Java 11在String类中添加了新的strip…方法。这些方法使用更加Unicode智能的空白字符定义。请查看Character::isWhitespace的类JavaDoc中的规则。

示例代码。

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.strip();
System.out.println("after->>"+input+"<<-");

或者您可以剥离仅前导仅尾随的空格。

您没有明确提到哪些代码点构成您的换行符。我想您的换行符可能包含在strip所针对的代码点列表中:

  • 它是Unicode空格字符(SPACE_SEPARATOR、LINE_SEPARATOR或PARAGRAPH_SEPARATOR),但不是非间断空格('\u00A0'、'\u2007'、'\u202F')。
  • 它是 '\t', U+0009 横向制表符。
  • 它是 '\n', U+000A 换行符。
  • 它是 '\u000B', U+000B 垂直制表符。
  • 它是 '\f', U+000C 换页符。
  • 它是 '\r', U+000D 回车符。
  • 它是 '\u001C', U+001C 文件分隔符。
  • 它是 '\u001D', U+001D 分组符号。
  • 它是 '\u001E', U+001E 记录分隔符。
  • 它是 '\u001F', U+0

6

4

如果您只想删除String的开头和结尾(不是中间)的换行符(而不是空格、制表符),则可以使用以下方法:

使用正则表达式从字符串开头(^)和结尾($)删除回车符(\\r)和换行符(\\n):

 s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "")

完整示例:

public class RemoveLineBreaks {
    public static void main(String[] args) {
        var s = "\nHello world\nHello everyone\n";
        System.out.println("before: >"+s+"<");
        s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "");
        System.out.println("after: >"+s+"<");
    }
}

它的输出结果为:

before: >
Hello world
Hello everyone
<
after: >Hello world
Hello everyone<

2

试试这个

function replaceNewLine(str) { 
  return str.replace(/[\n\r]/g, "");
}

2

我也想补充一个答案,因为虽然我有同样的问题,但是提供的答案并不足够。经过一番思考,我意识到可以使用正则表达式非常容易地完成此操作。

要从开头移除换行符

// Trim left
String[] a = "\n\nfrom the beginning\n\n".split("^\\n+", 2);

System.out.println("-" + (a.length > 1 ? a[1] : a[0]) + "-");

字符串的结尾:

// Trim right
String z = "\n\nfrom the end\n\n";

System.out.println("-" + z.split("\\n+$", 2)[0] + "-");

我确信这不是最高效的字符串修剪方式。但它似乎是内联此类操作的最清洁和简单的方式。

请注意,由于它是一个简单的正则表达式,因此可以对任何变量和组合的字符从任一端进行修剪


是的,但如果你不知道开头/结尾有多少行呢?你的解决方案假设这两种情况下都恰好有2个换行符。 - Luka Govedič
split() 的第二个参数只是限制次数。如果您想匹配无限次,请省略它。 - Zhro

1
String trimStartEnd = "\n TestString1 linebreak1\nlinebreak2\nlinebreak3\n TestString2 \n";
System.out.println("Original String : [" + trimStartEnd + "]");
System.out.println("-----------------------------");
System.out.println("Result String : [" + trimStartEnd.replaceAll("^(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])|(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])$", "") + "]");
  1. 字符串开头 = ^ ,
  2. 字符串结尾 = $ ,
  3. 正则表达式组合 = | ,
  4. 换行符 = \r\n|[\n\x0B\x0C\r\u0085\u2028\u2029]

0

另一种优雅的解决方案。

String myString = "\nLogbasex\n";
myString = org.apache.commons.lang3.StringUtils.strip(myString, "\n");

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