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

问题描述 投票:0回答:12

我有一个字符串,其中包含一些文本,后跟一个空行。保留带有文本的部分,但从末尾删除空白换行符的最佳方法是什么?

java string line blank-line
12个回答
371
投票

使用

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

String trimmedString = myString.trim();

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

27
投票

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

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

仅从行尾删除换行符:

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

仅从行首删除换行符:

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

13
投票

tl;博士

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

String::strip…

旧的

String::trim
方法对 whitespace 有一个奇怪的定义

正如此处所讨论的,Java 11 向 strip…

 类添加了新的 
String
 方法。它们使用更符合 Unicode 的空白定义。请参阅类 JavaDoc 中此定义的规则 
Character::isWhitespace

示例代码。

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')。
  • 它是“ ”,U+0009 水平制表。
  • 是' ', U+000A 换行。
  • 它是“\u000B”,U+000B 垂直制表。
  • 是“ ”,U+000C 换页。
  • 是' ', U+000D 回车。
  • 它是'\u001C',U+001C 文件分隔符。
  • 它是“\u001D”,U+001D 组分隔符。
  • 它是'\u001E',U+001E记录分隔符。
  • 是'\u001F',U+0

6
投票

如果您的字符串可能是

null
,请考虑使用
StringUtils.trim()
-
String.trim()
的空安全版本。


4
投票

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

使用正则表达式从字符串的开头 (

\\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
投票

我也将对此添加一个答案,因为虽然我有同样的问题,但提供的答案还不够。经过一番思考,我意识到使用正则表达式可以非常轻松地完成此操作。

要从开头删除换行符

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

我确信这不是修剪字符串的最高效的方法。但它似乎确实是内联此类操作的最干净、最简单的方法。

请注意,可以使用相同的方法来修剪两端字符的任何变体和组合,因为它是一个简单的正则表达式。


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. 换行= |[ \x0B\x0C \u0085\u2028\u2029]

1
投票

试试这个

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

0
投票

另一个优雅的解决方案。

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

0
投票

对于在处理不同换行符时寻找问题答案的其他人:

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

这应该准确删除最后一个换行符并保留字符串中的所有其他空格并与 Unix 一起使用( )、Windows( )和旧Mac( )换行符:https://stackoverflow.com/a/20056634https://stackoverflow.com/a/49791415

"\\R"
是Java 8中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$", ""));

-5
投票
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
© www.soinside.com 2019 - 2024. All rights reserved.