web-dev-qa-db-fra.com

Comment éliminer TOUS les sauts de ligne d'une chaîne?

J'ai besoin de supprimer tous les sauts de ligne qui apparaissent dans mes chaînes (provenant de db) . Je le fais en utilisant le code ci-dessous:

value.Replace("\r\n", "").Replace("\n", "").Replace("\r", "")

Je peux voir qu'il y a au moins un personnage agissant comme une fin de ligne qui lui a survécu. Le code de caractère est 8232 .

C'est très boiteux de ma part, mais je dois dire que c'est la première fois que j'ai le plaisir de voir ce personnage. Il est évident que je peux simplement remplacer ce caractère directement, mais je pensais étendre mon approche actuelle (basée sur le remplacement des combinaisons de "\ r" et "\ n") à quelque chose de beaucoup plus solide, elle n'incluerait donc pas le ' 8232 ', mais aussi tous les autres non encore trouvés par moi.

Avez-vous une approche à toute épreuve pour un tel problème?

EDIT # 1:

Il me semble qu'il y a plusieurs solutions possibles:

  1. utiliser Regex.Replace 
  2. supprime tous les caractères si c'est IsSeparator ou IsControl
  3. remplace par "" si c'est IsWhiteSpace
  4. créer une liste de toutes les fins de ligne possibles ("\ r\n", "\ r", "\ n", LF, VT, FF, CR, CR + LF, NEL, LS, PS) et les remplacer simplement par des chaîne. C'est beaucoup de remplaçants.

Je dirais que les meilleurs résultats seront obtenus après l’application des première et quatrième approches, mais je ne peux pas décider laquelle sera la plus rapide. Selon vous, lequel est le plus complet?

EDIT # 2

J'ai posté une réponse ci-dessous.

40
IamDeveloper

Vous trouverez ci-dessous la méthode d’extension qui résout mon problème. LineSeparator et ParagraphEnding peuvent bien sûr être définis ailleurs, comme des valeurs statiques, etc.

public static string RemoveLineEndings(this string value)
{
    if(String.IsNullOrEmpty(value))
    {
        return value;
    }
    string lineSeparator = ((char) 0x2028).ToString();
    string paragraphSeparator = ((char)0x2029).ToString();

    return value.Replace("\r\n", string.Empty)
                .Replace("\n", string.Empty)
                .Replace("\r", string.Empty)
                .Replace(lineSeparator, string.Empty)
                .Replace(paragraphSeparator, string.Empty);
}
59
IamDeveloper

Selon wikipedia , il existe de nombreux terminateurs de ligne que vous devrez peut-être gérer (y compris celui que vous mentionnez).

LF: saut de ligne, U + 000A
VT: onglet vertical, U + 000B
FF: saut de page, U + 000C
CR: retour chariot, U + 000D
CR + LF: CR (U + 000D) suivi de LF (U + 000A)
NEL: ligne suivante, U + 0085
LS: séparateur de ligne, U + 2028
PS: séparateur de paragraphe, U + 2029

22
Tremmors

8232 (0x2028) et 8233 (0x2029) sont les seuls autres que vous pourriez vouloir éliminer. Voir la documentation de char.IsSeparator .

13
Ed Bayiates

Les accessoires de Yossarian sur celui-ci, je pense qu'il a raison. Remplacez tous les espaces par un seul espace:

data = Regex.Replace(data, @"\s+", " ");
9
csharptest.net

Je recommande de supprimer TOUS les espaces (char.IsWhitespace) et de les remplacer par des espaces simples. IsWhiteSpace prend en charge tous les espaces unicode étranges.

7
nothrow

Avez-vous essayé string.Replace(Environment.NewLine, "")? Cela en reçoit souvent beaucoup pour moi.

4
Josh

C’est ma première tentative, mais je pense que cela fera ce que vous voulez ...

var controlChars = from c in value.ToCharArray() where Char.IsControl(c) select c;
foreach (char c in controlChars)  
   value = value.Replace(c.ToString(), "");

Voir aussi ce lien pour plus de détails sur les autres méthodes que vous pouvez utiliser: Méthodes Char

4
Robert Iver

Consultez ce lien: http://msdn.Microsoft.com/en-us/library/844skk0h.aspx

Vous devrez jouer et créer une expression REGEX qui vous convient. Mais voici le squelette ...

static void Main(string[] args)
{

        StringBuilder txt = new StringBuilder();
        txt.Append("Hello \n\n\r\t\t");
        txt.Append( Convert.ToChar(8232));

        System.Console.WriteLine("Original: <" + txt.ToString() + ">");

        System.Console.WriteLine("Cleaned: <" + CleanInput(txt.ToString()) + ">");

        System.Console.Read();

    }

    static string CleanInput(string strIn)
    {
        // Replace invalid characters with empty strings.
        return Regex.Replace(strIn, @"[^\w\.@-]", ""); 
    }
1
BBC

En supposant que 8232 soit unicode, vous pouvez le faire:

value.Replace("\u2028", string.Empty);
0
Icemanind

personnellement j'irais avec 

    public static String RemoveLineEndings(this String text)
    {
        StringBuilder newText = new StringBuilder();
        for (int i = 0; i < text.Length; i++)
        {
            if (!char.IsControl(text, i))
                newText.Append(text[i]);
        }
        return newText.ToString();
    }
0
Manatherin

Voici quelques solutions rapides avec .NET regex:

  • Pour supprimer tout espace d'une chaîne: s = Regex.Replace(s, @"\s+", ""); (\s correspond à tous les caractères Unicode)
  • Pour supprimer tous les espaces BUT CR et LF: s = Regex.Replace(s, @"[\s-[\r\n]]+", ""); ([\s-[\r\n]] est une classe de caractères contenant une construction de soustraction, elle correspond à tout espace sauf CR et LF)
  • Pour supprimer tout espace blanc vertical, soustrayez \p{Zs} (tout espace horizontal sauf tab) et \t (tab) de \s: s = Regex.Replace(s, @"[\s-[\p{Zs}\t]]+", "");.

Envelopper le dernier dans une méthode d'extension:

public static string RemoveLineEndings(this string value)
{
    return Regex.Replace(value, @"[\s-[\p{Zs}\t]]+", "");
}

Voir la démo regex .

0
Wiktor Stribiżew