ChatGPT解决这个技术问题 Extra ChatGPT

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

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

请告诉我们更多:对您来说什么是“换行符”?你想用什么来代替它们?
哈哈。当我发现 System.getProperty("line.separator") 是古玩以了解 C# 中的对应项时,我在 java 中检查了相同的内容。你的帖子帮助了我。

S
Si8

使用 Environment.NewLine 替换

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

如其他帖子中所述,如果字符串来自另一个环境 (OS),那么您需要替换 new line control characters 的特定环境实现。


首先它对我不起作用。经过一番研究,我找到了解决方案:我必须使用“使用系统;”或'System.Environment.NewLine'
没有删除所有换行符。试试这个字符串 "\n \r\nMy message \r\n \n \r\n is this.\n \n \r\n"
总的来说,我喜欢这个解决方案。但是,请注意,即使在同一个操作系统上,实际的换行符也可能不匹配。这发生在我身上,为什么处理返回 SQL。新行是 \n,而 Environment.NewLine 是 \r\n。结果是什么都没有匹配,所以新的行仍然存在。
@Dono > SQL 数据来自哪里?可能来自以 UNIX 方式处理新行的外部来源。这是数据格式的问题,而不是操作系统或这种方法......
这应该是 String 类的静态方法之一。 .NET 本身应该能够检测字符串中源换行符的格式并将其转换为 Environment.NewLine \r\n 格式...
M
Mark Byers

到目前为止发布的解决方案要么仅替换 Environment.NewLine,要么在替换字符串包含换行符时失败,因为它们多次调用 string.Replace

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

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

所以你说 Regex.Replace(input, @"[\r\n]+", replacementString) 不会完成同样的任务吗?
@flamebaud 不,如果连续有多个换行符,那会产生不同的结果。 "\r\n?|\n" 将替换每个换行符,而 "[\r\n]+" 将对任意数量的换行符进行一次替换。
对于那些担心多个换行符的人:/(\r\n?|\n)/gm
如果要删除可能来自不同操作系统的字符串中的换行符,这实际上是正确的解决方案。很好的例子是 JSON 格式。 +1
如果不使用逐字字符串(@ 前缀),那么您需要在使用它的任何地方连续有两个反斜杠,因此上面@mark_byers 的答案仍然是正确的。 @ 前缀使得反斜杠成为字符串的一部分,Regex 必须将其用作转义字符。
Z
ZombieSheep

要扩展 The.Anyi.9 的答案,您还应该注意 different types of line break in general use。根据您的文件的来源,您可能需要查看确保您抓住所有替代方案......

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

应该让你去...


首先,我更喜欢环境,但如果字符串不是来自其运行的系统,它将无法工作。 +1
Line.Replace("\n", replaceWith).Replace("\r", replaceWith); 还不够吗?
不,因为如果您有 \r\n,您最终会得到两次替换字符串 - 不理想。
你不需要字符串文字吗? string removedBreaks = Line.Replace(@"\r\n", replaceWith).Replace(@"\n", replaceWith).Replace(@"\r", replaceWith);
@ShawnDotey 不需要,我们要替换控制字符,而不是反斜杠和字母序列。
7
7 revs

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

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

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

当我想将检索到的网页代码折叠成一行时(为了使正则表达式模式更容易),这是唯一对我有用的东西。
完全同意布赖恩河邦迪。至少,Corin 提供的解决方案非常天真。
S
Sumner Evans

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

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

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


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

如果您想“清理”新行,使用正则表达式 @"[\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
  }
}

在大多数情况下,替换新行的最佳答案。
感谢这个有用的示例代码。我是通过这个 sytnax 修复的: Regex.Replace(str, @"[\r\n]+", "-")
这就是我一直在寻找的
t
tvanfosson

不要忘记 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 - 只是使用了错误的引号。在我回答这个问题的那天,一定是在做大量的 javascript。
@Califf - 它是等价的,而不是更好。
你在这里犯的错误只是证明它更好。我工作过的大多数公司都有他们的编码标准——不要使用硬编码的文字。
@Califf 我犯的“错误”不会在带有 Intellisense 的 IDE 中犯,也不会编译。如果您觉得 string.Empty 更好,请务必使用它。
D
Dominik Szymański

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

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

并按此顺序,当您找到一些行尾字符组合时,不要进行额外的换行符。


W
WonderWorker

为什么不兼得?

string ReplacementString = "";

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

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


B
Boris Dligach

在 .NET 6 中使用新方法

myString = myString.ReplaceLineEndings("");

文档:ReplaceLineEndings


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
这值得更多的赞成! :)
C
Chris Forrence

我需要将 \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;
}

M
Matt Hinze
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);

您的答案在正则表达式之前缺少“@”字符。
S
Scott

由于新行可以由 \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");
}

T
The.Anti.9

使用 .Replace() 方法

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

d
data

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

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

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


J
Jeppe Stig Nielsen

另一种选择是在有问题的字符串上创建一个 StringReader。在阅读器上,循环执行 .ReadLine()。然后你有分隔线,不管他们有什么(一致或不一致)分隔符。有了它,您可以随心所欲地进行;一种可能性是使用 StringBuilder 并在其上调用 .AppendLine

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


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

或者

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

取决于你想走哪条路。

希望它有所帮助。


T
Tadej

如果您只想替换换行符:

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);

M
MSS

基于@mark-bayers 的回答和更清晰的输出:

string result = Regex.Replace(ex.Message, @"(\r\n?|\r?\n)+", "replacement text");

它删除了 \r\n\n\r ,同时更喜欢更长的一个并将多次出现简化为一个。