55 votes

Ce qui est une façon rapide de la force CRLF en C# / .NET?

Comment feriez-vous pour normaliser toutes les nouvelles de la ligne de séquences dans une chaîne de caractères à un seul type?

Je suis à la recherche pour faire de tous CRLF pour l'application de courrier électronique (MIME documents). Dans l'idéal, ce serait enveloppé dans une méthode statique, l'exécution très rapidement, et ne pas utiliser les expressions régulières (depuis les variances des sauts de ligne, retour chariot, etc. sont limitées). Peut-être il y a même un BCL méthode que j'ai négligé?

HYPOTHÈSE: Après le donner à ceci un peu plus de réflexion, je pense que c'est une hypothèse sûre-à-dire que les CR sont soit autonome ou partie de la séquence CRLF. C'est, si vous voyez CRLF alors, vous savez, tous les CR peuvent être supprimés. Sinon, il est difficile de dire combien de lignes doit venir de quelque chose comme "\r\n\n\r".

76voto

Daniel Brückner Points 36242
input.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n")

Cela fonctionne si l'entrée ne contient qu'un seul type de sauts de ligne - soit CR ou LF ou CR+LF.

32voto

Jon Skeet Points 692016

Cela dépend exactement ce que les exigences sont. En particulier, comment voulez-vous gérer "\r" sur son propre? Devrait-ce que ça compte comme un saut de ligne ou pas? Comme un exemple, comment devrait "un\n\rb" - elle être traitée? Est-ce un de très bizarre, saut de ligne, un "\n" pause puis un voyou "\r", ou les deux mais les sauts de ligne? Si "\r" et "\n" peuvent être tous les deux retours à la ligne (sur leur propre, pourquoi devrais - "\r\n" ne pas être traités comme deux mais les sauts de ligne?

Voici un code qui je pense est raisonnablement efficace.

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

4voto

Nathan Points 3790
string nonNormalized = "\r\n\n\r";

string normalized = nonNormalized.Replace("\r", "\n").Replace("\n", "\r\n");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X