在C#中替换字符串中的换行符

614

我该如何在C#中替换字符串中的换行符?


2
请告诉我们更多:对于您来说,“换行符”是什么? 您想用什么替换它们? - Jay Bazuzi
哈哈。我在查找Java中的同一问题时,发现System.getProperty("line.separator"),很好奇C#中对应的是什么。你的帖子帮了我大忙。 - Ravisha
20个回答

819

使用 Environment.NewLine 替换字符串中的换行符。

myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;

如其他帖子所述,如果该字符串来自于另一个环境(操作系统),那么您需要替换该特定环境中的换行控制字符的实现。


8
一开始对我来说没有起作用,经过一些研究,我找到了解决方案:我必须使用 'using System;' 或者 'System.Environment.NewLine'。 - Smolla
14
没有移除所有的换行符。请尝试这个字符串 "\n \r\n我的消息\r\n \n \r\n就是这样。\n \n \r\n" - Shakti Prakash Singh
20
总的来说,我喜欢这个解决方案。但是请注意,即使在相同的操作系统上,实际的换行符可能不匹配。当我处理返回的 SQL 时就遇到了这种情况。新的换行符是 \n,而 Environment.NewLine 是 \r\n。结果是没有匹配到任何内容,所以新的换行符保留了下来。 - Dono
@Dono > SQL数据来自哪里?可能来自以UNIX方式处理换行符的外部来源。这是数据格式的问题,而不是操作系统或此方法的问题... - Laurent S.
1
这应该是String类的静态方法之一。.NET本身应该能够检测字符串中源行断点的格式并将其转换为Environment.NewLine \r\n格式... - Dean Kuga
使用CSS代替暴露自己于XSS漏洞之中。<span style="white-space: pre-line">@Model.CommentText</span> - Mike Olund

539
到目前为止,发布的解决方案要么仅替换Environment.NewLine,要么如果替换字符串包含换行符,则会因调用多次string.Replace而失败。
以下是一种解决方案,它使用正则表达式在字符串上进行一次遍历以进行三个替换。这意味着替换字符串可以安全地包含换行符。
string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

4
你的意思是执行Regex.Replace(input, @"[\r\n]+", replacementString)不能完成相同的任务吗? - flamebaud
10
不会,如果有多个连续的换行符,则会产生不同的结果。 "\r\n?|\n" 将替换每个换行符,而 "[\r\n]+" 则会将任意数量的换行符进行单次替换。 - David Hammond
1
对于那些担心多个换行符的人:/(\r\n?|\n)/gm - BobbyA
4
如果您想删除可能来自不同操作系统的字符串中的换行符,这实际上是正确的解决方案。JSON格式化是一个很好的例子。+1 - Bastien Vandamme
1
如果不使用逐字字符串(@前缀),则在使用时需要在每个地方都有两个反斜杠,因此上面@mark_byers的答案仍然是正确的。@前缀使反斜杠成为字符串的一部分,Regex必须将其用作转义字符。 - Kirk Liemohn
显示剩余5条评论

187
为了扩展The.Anyi.9的回答,你还应该知道一般使用中不同类型的换行符。根据文件的来源,你可能需要查看确保捕获所有的替代方案...
string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

应该让你开始...


6
起初我更喜欢环境这个东西,但如果字符串不来自于它运行的系统,它就无法工作。+1 - Flo
当我尝试在C#中使用它来替换PowerShell输出中的换行符时,这个解决方案对我不起作用。使用Replace(System.Environment.NewLine,"")对我有效。 - Ram
1
Line.Replace("\n", replaceWith).Replace("\r", replaceWith); 这个不够吗? - Thomas Ayoub
6
不行,因为如果你有\r\n的话,最终会得到两次替换字符串,这并不理想。 - ZombieSheep
2
你不需要字符串字面量吗?string removedBreaks = Line.Replace(@"\r\n", replaceWith).Replace(@"\n", replaceWith).Replace(@"\r", replaceWith); - Shawn Dotey
3
@ShawnDotey 不需要,我们想要替换控制字符,而不是反斜杠和字母的序列。 - N. Kudryavtsev

45

如果我想要在字符串中插入一个换行符但不删除所有的换行符,我会使用Environment.Newline。

根据您的平台,您可以有不同类型的换行符,但即使在同一平台上,通常也会使用不同类型的换行符。特别是当处理文件格式和协议时。

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}

当我想将检索到的网页代码折叠成一行(以便于制作正则表达式模式)时,这是唯一有效的方法。 - Paw Baltzersen
完全同意Brian R. Bondy的观点。Corin提供的解决方案并且得到了很多赞,但至少非常幼稚。 - Califf

29

使用.NET 6中的新方法

myString = myString.ReplaceLineEndings();

替换当前字符串中的所有换行序列。

文档: ReplaceLineEndings


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
4
现在应该将此作为已接受的答案。 - Ory Zaidenvorm
1
请注意,所示方法有一个重载,它需要一个字符串参数来进行替换。否则,它只会用 Environment.NewLine 替换换行符 - 有时这可能是需要的 :) - Nicolai Krüger

19

如果你想要“清除”新行,使用正则表达式 @"[\r\n]+" 来评论 Flamebaud 是最好的选择。

using System;
using System.Text.RegularExpressions;

class MainClass {
  public static void Main (string[] args) {
    string str = "AAA\r\nBBB\r\n\r\n\r\nCCC\r\r\rDDD\n\n\nEEE";

    Console.WriteLine (str.Replace(System.Environment.NewLine, "-"));
    /* Result:
    AAA
    -BBB
    -
    -
    -CCC


    DDD---EEE
    */
    Console.WriteLine (Regex.Replace(str, @"\r\n?|\n", "-"));
    // Result:
    // AAA-BBB---CCC---DDD---EEE

    Console.WriteLine (Regex.Replace(str, @"[\r\n]+", "-"));
    // Result:
    // AAA-BBB-CCC-DDD-EEE
  }
}

在大多数情况下,替换换行符的最佳答案。 - Md Shahbaz Ahmad
感谢这个有用的示例代码。我通过以下语法进行了修复:Regex.Replace(str, @"[\r\n]+", "-") - Sedat Kumcu
这就是我一直在寻找的。 - Pawel Cioch

19

如果你的代码需要在不同环境中运行,建议使用Environment.NewLine常量,因为它是特定环境中使用的换行符

line = line.Replace(Environment.NewLine, "newLineReplacement");

然而,如果你从另一个系统的文件中获取文本,则可能不是正确的答案,你应该替换为在其他系统上使用的任何换行符常量。通常会是\n\r\n


你需要将其重新分配回原始变量,因为替换不会在原地发生。 - tvanfosson
@driss,当您不知道文件来自哪个系统时,您如何选择正确的换行符常量?这个解决方案似乎真正是通用的。 - Califf

16
为了确保替换所有可能的换行方式(Windows、Mac 和 Unix),您应该使用:

为了确保替换所有可能的换行方式(Windows、Mac 和 Unix),您应该使用:

string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');

按照这个顺序,当你发现某些行末字符的组合时,不要产生额外的换行。


16

不要忘记,replace方法不会在字符串中进行字符替换,而是返回一个新的被替换后的字符串。下面的代码将会删除行尾符(而不是替换它们)。如果要使用其他方式替换,则可以考虑使用@Brian R. Bondy提供的方法,并将其作为扩展方法使用。在调用Replace或提供的扩展方法之前,请先检查空值。

string line = ...

line = line.Replace( "\r", "").Replace( "\n", "" );

作为扩展方法:

public static class StringExtensions
{
   public static string RemoveLineBreaks( this string lines )
   {
      return lines.Replace( "\r", "").Replace( "\n", "" );
   }

   public static string ReplaceLineBreaks( this string lines, string replacement )
   {
      return lines.Replace( "\r\n", replacement )
                  .Replace( "\r", replacement )
                  .Replace( "\n", replacement );
   }
}

在C#中不能有'' - 没有空字符的概念。是否可以使用'\0'代替? - Shevek
1
@Shevek -- 刚才使用了错误的引号。可能是因为我在回答这个问题的那天写了相当多的JavaScript代码。 - tvanfosson
@Califf - 它是等价的,而不是更好。 - tvanfosson
2
你在这里犯的错误只证明了它确实更好。 我为之工作的大多数公司都有编码标准 - 不要使用硬编码字面量。 - Califf
2
@Califf,如果我在使用带有Intellisense的IDE或编译器时,就不会犯这个“错误”。如果你认为string.Empty更好,请放心使用。 - tvanfosson

8

为什么不两者兼顾呢?

string ReplacementString = "";

Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);

注意:请将strin替换为您输入字符串的名称。


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