什么是在C#/ .NET中强制CRLF的快速方法?

Nei*_*ski 43 .net c# string newline

您如何将字符串中的所有换行序列规范化为一种类型?

我希望将它们全部用于电子邮件(MIME文档)的CRLF.理想情况下,这将包装在静态方法中,执行速度非常快,而不是使用正则表达式(因为换行符,回车符等的差异是有限的).也许甚至有一种我忽略的BCL方法?

假设:在更多地考虑之后,我认为说CR是独立的或CRLF序列的一部分是一个安全的假设.也就是说,如果您看到CRLF,那么您就知道可以删除所有CR.否则,很难说出"/ r \n \n\r"之类的行数应该是多少.

Dan*_*ner 62

input.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n")
Run Code Online (Sandbox Code Playgroud)

如果输入只包含一种类型的换行符(CR,LF或CR + LF),这将起作用.

  • 通过使用最后一个替换插入 BR 标记,也适用于在 HTML 页面上显示未知文本。Server.HtmlEncode(input).Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "<br />"); (3认同)

Jon*_*eet 29

这取决于准确的要求是什么.特别是,你想如何自己处理"\ r"?这应算作换行吗?作为一个例子,如何处理"a \n\rb"?这是一个非常奇怪的换行,一个"\n"休息然后是一个流氓"\ r",还是两个单独的换行符?如果"\ r"和"\n"都可以自行换行,为什么"\ r \n"不能被视为两个换行符?

这是一些我怀疑合理有效的代码.

using System;
using System.Text;

class LineBreaks
{    
    static void Main()
    {
        Test("a\nb");
        Test("a\nb\r\nc");
        Test("a\r\nb\r\nc");
        Test("a\rb\nc");
        Test("a\r");
        Test("a\n");
        Test("a\r\n");
    }

    static void Test(string input)
    {
        string normalized = NormalizeLineBreaks(input);
        string debug = normalized.Replace("\r", "\\r")
                                 .Replace("\n", "\\n");
        Console.WriteLine(debug);
    }

    static string NormalizeLineBreaks(string input)
    {
        // Allow 10% as a rough guess of how much the string may grow.
        // If we're wrong we'll either waste space or have extra copies -
        // it will still work
        StringBuilder builder = new StringBuilder((int) (input.Length * 1.1));

        bool lastWasCR = false;

        foreach (char c in input)
        {
            if (lastWasCR)
            {
                lastWasCR = false;
                if (c == '\n')
                {
                    continue; // Already written \r\n
                }
            }
            switch (c)
            {
                case '\r':
                    builder.Append("\r\n");
                    lastWasCR = true;
                    break;
                case '\n':
                    builder.Append("\r\n");
                    break;
                default:
                    builder.Append(c);
                    break;
            }
        }
        return builder.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)


Zot*_*tta 6

简单变体:

Regex.Replace(input, @"\r\n|\r|\n", "\r\n")
Run Code Online (Sandbox Code Playgroud)

为了更好的表现:

static Regex newline_pattern = new Regex(@"\r\n|\r|\n", RegexOptions.Compiled);
[...]
    newline_pattern.Replace(input, "\r\n");
Run Code Online (Sandbox Code Playgroud)