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


512

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


2
请告诉我们更多:什么是“换行符”?您要用什么替换它们?
杰伊·巴祖兹

哈哈。当我发现System.getProperty(“ line.separator”)是了解C#中的对应项的古玩时,我正在用Java进行检查。你的帖子对我有帮助。
拉维沙

Answers:


715

使用替换为 Environment.NewLine

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

如其他文章所述,如果字符串来自其他环境(OS),则需要用新的行控制字符替换该特定环境的实现。


8
首先,它对我不起作用。经过研究,我找到了解决方案:我必须使用“ using System”;或“ System.Environment.NewLine”
Smolla'2

12
没有删除所有换行符。试试这个字符串“ \ n \ r \ n我的消息\ r \ n \ n \ r \ n是这个。\ n \ n \ r \ n”
Shakti Prakash Singh 2013年

13
总的来说,我喜欢这种解决方案。但是,请注意,即使在同一操作系统上,实际的换行符也可能不匹配。这发生在我身上,为什么处理返回了SQL。新行是\ n,而Environment.NewLine是\ r \ n。结果是没有任何匹配,因此保留了新行。
2013年

@Dono> SQL数据来自哪里?可能是从外部来源以UNIX方式处理新行。这是数据格式的问题,而不是操作系统或这种方法的问题……
Laurent S.

这应该是String类的静态方法之一。.NET本身应该能够检测字符串中源换行符的格式并将其转换为Environment.NewLine \ r \ n格式...
Dean Kuga

442

到目前为止发布的解决方案只能替换,Environment.NewLine否则如果替换字符串包含换行符,则它们会失败,因为它们会string.Replace多次调用。

这是一个使用正则表达式的解决方案,只需对字符串进行一次传递即可完成所有三个替换。这意味着替换字符串可以安全地包含换行符。

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

3
所以你说做Regex.Replace(input,@“ [\ r \ n] +”,replaceString)不会完成相同的任务吗?
Flamebaud

7
@flamebaud不,如果连续出现多个换行符,将会产生不同的结果。“ \ r \ n?| \ n”将替换每个换行符,而“ [\ r \ n] +”将替换任意数量的换行符。
David Hammond 2014年

对于那些担心多个换行符的人:/(\ r \ n?| \ n)/ gm
BobbyA '16

4
如果要删除可能来自其他操作系统的字符串中的换行符,这实际上是正确的解决方案。JSON格式就是一个很好的例子。+1
Bastien Vandamme

1
如果不使用逐字字符串(@前缀),则在使用它的任何地方都需要连续两个反斜杠,因此上述@mark_byers的答案仍然正确。@前缀使之成为反斜杠是字符串的一部分,正则表达式必须将其用作转义字符。
Kirk Liemohn

173

要扩展The.Anyi.9的答案,您还应该了解一般使用不同类型的换行符。根据文件的来源,您可能要确保所有其他方法都可以找到...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

应该让你走...


6
首先,我更喜欢环境,但是如果String不是来自运行它的系统,它将无法正常工作。+1
Flo

1
Line.Replace("\n", replaceWith).Replace("\r", replaceWith);不够吗
Thomas Ayoub

5
不,因为如果有的话,\r\n您将得到两次替换字符串-不理想。
ZombieSheep

1
您不需要字符串文字吗?字符串removeBreaks = Line.Replace(@“ \ r \ n”,replaceWith).Replace(@“ \ n”,replaceWith).Replace(@“ \ r”,replaceWith);
Shawn Dotey '17

2
@ShawnDotey不需要,我们要替换控制字符,而不是反斜杠和字母序列。
N. Kudryavtsev '18 -10-5

38

当我想为字符串插入换行符,而不是从字符串中删除所有换行符时,我将使用Environment.Newline。

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

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

当我想将检索到的网页代码折叠到一行时(这使正则表达式模式更容易),这是对我唯一有效的方法。
鲍尔·巴尔茨森(Bawtzersen)2011年

完全同意Brian R. Bondy。至少由科林(Corin)提供的解决方案非常受天才。
卡利夫(Califf)2013年

18

如果您的代码应该在不同的环境中运行,我会考虑使用Environment.NewLine常量,因为它是newline在特定环境中专门使用的。

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

但是,如果您从另一个系统上的文件中获取文本,则这可能不是正确的答案,您应该用在另一个系统上使用的换行常量替换。通常为\n\r\n


您需要将其重新分配回原始变量,因为替换没有发生。
tvanfosson

@driss我想知道当您不知道文件来自哪个系统时,如何选择正确的换行常量。此解决方案似乎确实是通用的。
卡利夫(Califf)2013年

14

别忘了replace不会在字符串中进行替换,而是返回替换了字符的新字符串。以下内容将删除换行符(而不是替换换行符)。如果用其他东西代替@Brian R. Bondy的方法(可能是作为扩展方法包装),我会使用@Brian R. Bondy的方法。请记住,在调用Replace或提供的扩展方法之前,请先检查null值。

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 2010年

1
@Shevek-只是使用了错误的引号。我回答这个问题的那天一定一直在做大量的javascript。
tvanfosson

@Califf-这是等效的,不是更好。
tvanfosson

2
您在这里犯的错误只是证明它更好。我工作过的大多数公司都将其作为编码标准-请勿使用硬编码的文字。
卡利夫(Califf)

2
@Califf我犯的“错误”不会在具有Intellisense的IDE中产生,也不会编译。如果您觉得string.Empty更好,请务必使用它。
tvanfosson

10

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

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

并且按照这种顺序,当您发现行尾字符的某种组合时,不要进行额外的换行。


8

如果您想“清理”新行,使用正则表达式的Flamebaud注释@"[\r\n]+"是最佳选择。

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
  }
}

在大多数情况下,更换新线的最佳答案。
沙巴兹·艾哈迈德

感谢您提供此有用的示例代码。我是通过以下语法固定的:Regex.Replace(str,@“ [\ r \ n] +”,“-”)
Sedat Kumcu

6

我需要\r\n用实际的回车符和换行符替换\t,并用实际的制表符替换。因此,我提出了以下建议:

public string Transform(string data)
{
    string result = data;
    char cr = (char)13;
    char lf = (char)10;
    char tab = (char)9;

    result = result.Replace("\\r", cr.ToString());
    result = result.Replace("\\n", lf.ToString());
    result = result.Replace("\\t", tab.ToString());

    return result;
}

6

为什么不同时?

string ReplacementString = "";

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

注意:strin输入字符串的名称替换。



2

使用.Replace()方法

Line.Replace("\n", "whatever you want to replace with");

2

安全更换换行符的最佳方法是

yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n")             //handling mac linebreaks

应该产生只带有\ n的字符串(例如换行符)作为换行符。此代码也可用于修复混合换行符。


2

由于新行可以由和分隔\n\r因此\r\n我们首先将\r和替换\r\n\n,然后才拆分数据字符串。

以下行应转到该parseCSV方法:

function parseCSV(data) {
    //alert(data);
    //replace UNIX new lines
    data = data.replace(/\r\n/g, "\n");
    //replace MAC new lines
    data = data.replace(/\r/g, "\n");
    //split into rows
    var rows = data.split("\n");
}

0
string s = Regex.Replace(source_string, "\n", "\r\n");

要么

string s = Regex.Replace(source_string, "\r\n", "\n");

取决于您要走的路。

希望能有所帮助。


0

另一个选择是StringReader在相关字符串上创建一个over。在阅读器上,.ReadLine()循环执行。然后,无论它们具有什么分隔符(一致或不一致),都可以将行分隔开。这样,您就可以继续进行;一种可能性是使用StringBuilder和呼叫.AppendLine

好处是,您让框架决定什么构成“换行符”。


0

如果只想替换换行符:

var input = @"sdfhlu \r\n sdkuidfs\r\ndfgdgfd";
var match = @"[\\ ]+";
var replaceWith = " ";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input.Replace(@"\n", replaceWith).Replace(@"\r", replaceWith), match, replaceWith);
Console.WriteLine("output: " + x);

如果要替换换行符,制表符和空格:

var input = @"sdfhlusdkuidfs\r\ndfgdgfd";
var match = @"[\\s]+";
var replaceWith = "";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input, match, replaceWith);
Console.WriteLine("output: " + x);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.