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

我有一个包含一些文本后跟一个空行的字符串。什么是最好的方法来保持与文本的部分,但删除空格换行从结束?

255406 次浏览

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

String trimmedString = myString.trim();
String.replaceAll("[\n\r]", "");
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

我也要给这个问题加上一个答案,因为,虽然我有同样的问题,但提供的答案是不够的。经过一番思考,我意识到使用正则表达式可以非常容易地完成这项工作。

从头删除 新台词:

// 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] + "-");

我确信这不是修整字符串的最有效的性能方法。但它确实似乎是内联这种操作的最干净和最简单的方法。

注意,同样的方法也可以用来修剪任何字符的变化和组合,因为它是一个简单的正则表达式。

如果您的字符串可能是 null,请考虑使用 StringUtils.trim()-String.trim()的空安全版本。

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. Linebreak = rn | [ n x0B x0C r u0085 u2028 u2029]

博士

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

String::strip…

旧的 String::trim方法的 奇怪的定义空格

正如所讨论的 给你,Java11向 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 + 000 A 行馈电。
  • 它是“ u000B”,U + 000B 垂直列表。
  • 它是’f’,U + 000C 形式馈电。
  • 是 r,U + 000D 车厢回程。
  • 它是“ u001C”,U + 001C 文件分离器。
  • 它是“ u001D”,U + 001D 组分离器。
  • 它是“ u001E”,U + 001E 记录分离器。
  • 是“ u001F”,U + 0

这段 Java 代码完全按照问题标题中的要求,即“从字符串的开头和结尾删除换行符-Java”:

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

只从行尾删除换行符:

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

只从行首删除换行符:

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

如果您只想删除字符串 开始和结束处的 换线(而不是空格、制表符) ,那么您可以使用以下方法:

使用正则表达式从字符串的开头(^)和结尾($)删除回车(\\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<

试试这个

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

另一个优雅的解决方案。

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

对于那些在处理不同的换行符时寻找问题答案的人来说:

string.replaceAll("(\n|\r|\r\n)$", ""); // Java 7
string.replaceAll("\\R$", "");          // Java 8

这样可以精确地删除最后一个换行符,并保留字符串中的所有其他空格,可以使用 Unix (n)、 Windows (r n)和旧的 Mac (r)换行符: https://stackoverflow.com/a/20056634https://stackoverflow.com/a/49791415"\\R"是 Java8中在 Pattern 类 https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html中引入的匹配器

它通过了这些测试:

// Windows:
value = "\r\n test \r\n value \r\n";
assertEquals("\r\n test \r\n value ", value.replaceAll("\\R$", ""));


// Unix:
value = "\n test \n value \n";
assertEquals("\n test \n value ", value.replaceAll("\\R$", ""));


// Old Mac:
value = "\r test \r value \r";
assertEquals("\r test \r value ", value.replaceAll("\\R$", ""));