31 votes

Suppression efficace de tous les espaces d'une chaîne

En C#, quelle est la meilleure façon de supprimer des lignes vides c'est à dire, les lignes qui ne contiennent que des espaces à partir d'une chaîne? Je suis heureux d'utiliser une Regex si c'est la meilleure solution.

EDIT: je dois ajouter que j'utilise .NET 2.0.


Bounty mise à jour: je vais rouler ce retour après le bounty est attribué, mais je tenais à préciser un peu les choses.

Tout d'abord, toute Perl 5 compat regex fonctionne. Ce n'est pas limité .NET développeurs. Le titre et les tags ont été modifiées pour tenir compte de cela.

Deuxièmement, alors que j'ai donné un exemple rapide de l'abondance de détails, il n'est pas le seul test que vous devez satisfaire. Votre solution doit supprimer toutes les lignes qui sont composées de rien, mais les espaces, ainsi que le dernier saut de ligne. Si il y a une chaîne qui, après l'exécution par le biais de votre regex, se termine par "/r/n" ou n'importe quel espace de caractères, il échoue.

21voto

Chris Schmich Points 16390

Si vous souhaitez supprimer des lignes contenant des espaces (tabulations, espaces), essayez:

 string fix = Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline);
 

Edit (pour @Will): La solution la plus simple pour couper les sauts de ligne de fin serait d'utiliser TrimEnd sur la chaîne résultante, par exemple:

 string fix =
    Regex.Replace(original, @"^\s*$\n", string.Empty, RegexOptions.Multiline)
         .TrimEnd();
 

18voto

Thomas Levesque Points 141081
string outputString;
using (StringReader reader = new StringReader(originalString)
using (StringWriter writer = new StringWriter())
{
    string line;
    while((line = reader.ReadLine()) != null)
    {
        if (line.Trim().Length > 0)
            writer.WriteLine(line);
    }
    outputString = writer.ToString();
}

14voto

Sky Sanders Points 19557

Du haut de ma tête...

 string fixed = Regex.Replace(input, "\s*(\n)","$1");
 

tourne ceci:

fdasdf
asdf
[onglets]

[les espaces]  

asdf


en cela:

fdasdf
asdf
asdf

8voto

dtb Points 104373

Utilisation de LINQ:

 var result = string.Join("\r\n",
                 multilineString.Split(new string[] { "\r\n" }, ...None)
                                .Where(s => !string.IsNullOrWhitespace(s)));
 

Si vous avez affaire à de grandes entrées et / ou à des fins de ligne incohérentes, vous devez utiliser un StringReader et faire à la place la vieille école ci-dessus avec une boucle foreach.

4voto

BenSwayne Points 10621

Bien que cette réponse est conforme à la clarification des exigences spécifiées dans la générosité:

J'ai aussi besoin de supprimer tous les sauts de ligne, et ma Regex-fu est à défaut d'. Mon bounty va à quelqu'un qui peut me donner une regex qui passe ce test: StripWhitespace("test\r\n \r\nune\r\n\r\n") == "test de\r\nce"

Alors, Voici la réponse:

(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|(\r?\n)+\z

Ou dans le code C# fournis par @Chris Schmich:

string fix = Regex.Replace("test\r\n \r\nthis\r\n\r\n", @"(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|(\r?\n)+\z", string.Empty, RegexOptions.Multiline);

Maintenant, nous allons essayer de le comprendre. Il existe trois modèles optionnels ici qui je suis disposé à le remplacer avec de l' string.empty.

  1. (?<=\r?\n)(\s*$\r?\n)+ - correspond à un nombre illimité de lignes ne contenant que des espaces blancs et précédé par un saut de ligne (mais ne correspond pas à la première précédant les sauts de ligne).
  2. (?<=\r?\n)(\r?\n)+ - correspond à un nombre illimité de lignes vides sans contenu qui sont précédées par un saut de ligne (mais ne correspond pas à la première précédant les sauts de ligne).
  3. (\r?\n)+\z - correspond à un nombre illimité de sauts de ligne à la fin de l'essai de chaîne (fuite des sauts de ligne que vous avez appelé de mer)

Qui répond à vos test parfaitement! Mais également satisfait les deux \r\n et \n saut de ligne, les styles! Faites le Test! Je crois que ce sera le plus de la réponse correcte, bien que plus simple expression passe de votre prime d'essai, cette expression ne passe plus complexes.

EDIT: @Will souligné l'existence d'une potentielle faille dans la dernière correspondance du modèle de la ci-dessus regex de ne pas correspondre à de multiples sauts de ligne contenant de l'espace blanc à la fin de la chaîne de test. Donc, nous allons changer ce dernier modèle à ceci:

\b\s+\z \B est un mot boundry (début ou à la FIN d'un mot), le \s+ est un ou plusieurs caractères espace blanc, l' \z est la fin de la chaîne de test (fin de "fichier"). Alors maintenant, il correspond à tout l'assortiment de l'espace à la fin du fichier, y compris les tabulations et des espaces en plus de retours chariot et les sauts de ligne. J'ai testé les deux À la disposition de cas de test.

Donc, tous ensemble, maintenant, il faut:

(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|\b\s+\z

EDIT #2: Bien, il y a encore un cas possible @Wil trouvé que la dernière expression régulière ne permet pas de couvrir. Ce cas est d'intrants qui ont des sauts de ligne au début du fichier avant de tout contenu. Ainsi permet d'en ajouter un modèle pour correspondre au début du fichier.

\A\s+ - L' \A correspondent au début du fichier, l' \s+ correspondent à un ou plusieurs caractères espace blanc.

Alors maintenant, nous avons:

\A\s+|(?<=\r?\n)(\s*$\r?\n)+|(?<=\r?\n)(\r?\n)+|\b\s+\z

Alors maintenant, nous avons quatre modèles pour la correspondance:

  1. les espaces blancs au début du fichier,
  2. redondante des sauts de ligne contenant l'espace blanc, (ex: \r\n \r\n\t\r\n)
  3. redondant sauts de ligne avec aucun contenu, (ex: \r\n\r\n)
  4. les espaces à la fin du fichier

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