规范化C#中的换行符

cta*_*cke 27 .net c#

我有一个数据流可能包含\ r,\n,\ r \n,\n\r或它们的任意组合.是否有一种简单的方法来规范化数据,使其全部简单地成为\ r \n对,以使显示更加一致?

所以会产生这种翻译表的东西:

\r     --> \r\n
\n     --> \r\n
\n\n   --> \r\n\r\n
\n\r   --> \r\n
\r\n   --> \r\n
\r\n\n --> \r\n\r\n
Run Code Online (Sandbox Code Playgroud)

Der*_*ark 35

我相信这会做你需要的:

using System.Text.RegularExpressions;
// ...
string normalized = Regex.Replace(originalString, @"\r\n|\n\r|\n|\r", "\r\n");
Run Code Online (Sandbox Code Playgroud)

我对确切的语法并不是100%肯定,而且我没有.Net编译器方便检查.我在perl中编写它,并将其转换为(希望是正确的)C#.唯一真正的诀窍是首先匹配"\ r \n"和"\n\r".

要将它应用于整个流,只需运行一大堆输入.(如果需要,可以使用流包装器执行此操作.)


原来的perl:

$str =~ s/\r\n|\n\r|\n|\r/\r\n/g;
Run Code Online (Sandbox Code Playgroud)

测试结果:

[bash$] ./test.pl
\r -> \r\n
\n -> \r\n
\n\n -> \r\n\r\n
\n\r -> \r\n
\r\n -> \r\n
\r\n\n -> \r\n\r\n
Run Code Online (Sandbox Code Playgroud)

更新:现在将\n\r转换为\ r \n,但我不会调用该规范化.

  • 您需要从替换字符串中删除"@".如果不这样做,它会将'\ r \n'替换为'\\ r \\n',因为你要求文字字符串"\ r \n".更好的是用Environment.NewLine常量替换. (4认同)

Lie*_*ero 13

从 .NET 6 开始,它是开箱即用的:

string normalized = originalString.ReplaceLineEndings(); //uses Environment.NewLine

string normalized = originalString.ReplaceLineEndings("\r\n");
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/dotnet/runtime/blob/a879885975b5498db559729811304888463c15ed/src/libraries/System.Private.CoreLib/src/System/String.Manipulation.cs#L1183


Joe*_*Joe 7

我和Regie的Jamie Zawinski在一起:

"有些人在面对问题时会想"我知道,我会使用正则表达式."现在他们有两个问题"

对于我们这些喜欢可读性的人:

  • 步骤1

    用\n替换\ r \n

    用\n替换\n \n(如果你真的想要这个,有些海报似乎没有想到)

    用\n替换\ r

  • 步骤2用Environment.NewLine或\ r \n或其他替换\n.

  • 这是一个微不足道的正则表达式.如果是HTML解析,我会同意你的看法. (7认同)