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

Posted

技术标签:

【中文标题】如何从字符串的开头和结尾删除换行符?【英文标题】:How to remove newlines from beginning and end of a string? 【发布时间】:2011-11-19 05:44:51 【问题描述】:

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

【问题讨论】:

Removing whitespace from strings in Java的可能重复 不,不是。链接中的问题是询问“替换”而不是.. 【参考方案1】:

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

String trimmedString = myString.trim();

【讨论】:

问题是关于换行的。这不仅删除了换行符【参考方案2】:
String.replaceAll("[\n\r]", "");

【讨论】:

兄弟,@JohnB 它也会删除字符串之间的所有换行符。要求是仅删除前导和尾随换行符。【参考方案3】:

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

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

仅从行尾删除换行符:

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

仅从行首删除换行符:

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

【讨论】:

您能否为您的答案提供额外的背景信息?这样每个人都可以理解你的代码做了什么以及为什么。 我已经为我的答案添加了解释。我希望现在一切都清楚了。 这是正确的解决方案,因为它只删除换行符,而不删除空格、制表符或其他空白字符。【参考方案4】:

tl;博士

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

String::strip…

旧的String::trim 方法有一个strange definition 或whitespace。

正如here 所讨论的,Java 11 向String 类添加了新的strip… 方法。这些使用了更加 Unicode-savvy 的空白定义。请参阅 Character::isWhitespace 的 JavaDoc 类中此定义的规则。

示例代码。

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

或者你可以去掉just the leading或just the trailing空格。

你没有确切地提到 code point(s) 组成你的换行符。我想您的换行符可能包含在strip 所针对的代码点列表中:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

我也将为此添加一个答案,因为虽然我有同样的问题,但提供的答案还不够。经过一番思考,我意识到使用正则表达式可以很容易地做到这一点。

从开头删除换行符

// 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 个换行符 split()的第二个参数就是极限。如果您想匹配无限次,请不要使用它。【参考方案8】:

试试这个

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

【讨论】:

【参考方案9】:
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])$", "") + "]");
    字符串开头 = ^ , 字符串结束 = $ , 正则表达式组合 = | , 换行符 = \r\n|[\n\x0B\x0C\r\u0085\u2028\u2029]

【讨论】:

【参考方案10】:

另一个优雅的解决方案。

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

【讨论】:

【参考方案11】:

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

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

这应该完全删除最后一个换行符并保留字符串中的所有其他空格并适用于 Unix (\n)、Windows (\r\n) 和旧 Mac (\r) 换行符:https://***.com/a/20056634、@987654322 @。 "\\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$", ""));

【讨论】:

【参考方案12】:
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

【讨论】:

这没有正确回答问题。它会删除所有 CR 和 LF,而不仅仅是开头和结尾的那些。 这将替换所有,不仅从开始和结束。

以上是关于如何从字符串的开头和结尾删除换行符?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery.trim()

整合去除HTML 标签, 去除开头结尾换行,将连续空格合并为一个

字符串

字符串

正则表达式

python 字符串常用方法