Comment supprimer les caractères de nouvelle ligne d'une chaîne?

184

J'ai une chaîne au format suivant

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

Je souhaite supprimer toutes les occurrences de \net \rde la chaîne ci-dessus.

J'ai essayé string s = s.Trim(new char[] {'\n', '\r'});mais cela n'a pas aidé.

Ashish Ashu
la source

Réponses:

334

J'aime utiliser des expressions régulières. Dans ce cas, vous pouvez faire:

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

Les expressions régulières ne sont pas aussi populaires dans le monde .NET qu'elles le sont dans les langages dynamiques, mais elles fournissent beaucoup de puissance pour manipuler les chaînes.

Église
la source
C'était certainement la meilleure solution pour moi. Un mélange harmonieux de ce C # et de JavaScript était tout ce dont j'avais besoin pour résoudre mon problème.
Joe Brunscheon
J'ai eu un problème similaire où je devais également supprimer les nouvelles lignes de ma chaîne. J'ai essayé de le faire avec string.Replace, n'a pas fonctionné. Lorsque j'ai utilisé Regex.Replace avec exactement la même chaîne d'expression régulière que le paramètre, cela a fonctionné. Merci.
instance du
9
Soyez prudent si vous l'utilisez dans une boucle qui traite plus de 1 million d'éléments. Regex est bien plus lent que juste String.Replace
Nick
L'exemple de code supprime également les tabulations \ t, ce qui n'est pas en question.
Michael Freidgeim
72

Vous souhaitez utiliser String.Replacepour supprimer un caractère.

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

Notez que String.Trim(params char[] trimChars)ne supprime que les caractères de début et de fin trimCharsde l'instance appelée sur.

Vous pouvez créer une méthode d'extension, ce qui évite les problèmes de performances de ce qui précède de créer beaucoup de chaînes temporaires:

static string RemoveChars(this string s, params char[] removeChars) {
    Contract.Requires<ArgumentNullException>(s != null);
    Contract.Requires<ArgumentNullException>(removeChars != null);
    var sb = new StringBuilder(s.Length);
    foreach(char c in s) { 
        if(!removeChars.Contains(c)) {
            sb.Append(c);
        }
    }
    return sb.ToString();
}
Jason
la source
8
Notez que cette approche créera deux objets chaîne intermédiaires. En fonction de la taille de votre chaîne, cela peut avoir des conséquences importantes sur les performances et la consommation de mémoire.
cdhowie
42

Je sais que c'est un ancien message, mais j'ai pensé partager la méthode que j'utilise pour supprimer les caractères de nouvelle ligne.

s.Replace(Environment.NewLine, "");

Références:

MSDN String.Replace, méthode et propriété MSDN Environment.NewLine

ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
la source
sympa pour le support Mono
Nick
1
Dans une application multi-environnement (c'est-à-dire une application Windows alimentée par des données du système Unix), cela posera plus de problèmes que de profits.
Jakub Szułakiewicz
15

Si la vitesse et la faible utilisation de la mémoire sont importantes, procédez comme suit:

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();
cdhowie
la source
Oui, j'irais avec ça aussi (dans une méthode d'extension). Toujours bon d'utiliser StringBuilder. +1
RPM1984
4
"Toujours bon d'utiliser le StringBuilder" <Je ne suis pas un pro, mais ce n'est pas strictement vrai. Cet article de Jeff Atwood fournit un aperçu amusant de la manipulation / concaténation de chaînes et, finalement, de l'optimisation.
Phil Cooper
5

fais juste ça

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);
Mahmoud ElMansy
la source
3

Une approche LINQ:

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'";

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));
wb
la source
2
Cela utilise la surcharge générique de string.Joinqui appellera ToStringsur chaque charretourné par la requête. Mieux vaut simplement transmettre les résultats de la requête au stringconstructeur. s1 = new string(s.Where(....).ToArrary());
juharr
0

Le bon choix dépend vraiment de la taille de la chaîne d'entrée et des exigences en matière de force et de mémoire, mais j'utiliserais une expression régulière comme

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

Ou si nous devons appliquer le même remplacement plusieurs fois, il est préférable d'utiliser une version compilée pour le Regex comme

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

REMARQUE: différents scénarios nécessitent différentes approches pour obtenir les meilleures performances et la consommation de mémoire minimale

Kalitsov
la source
0

Eh bien ... j'aimerais que vous compreniez des zones plus spécifiques de l'espace. \test en fait un espace horizontal et non vertical. (testez l'insertion \tdans le Bloc-notes)

Si vous utilisez Java, utilisez simplement \v. Voir la référence ci-dessous.

\h - Un caractère d'espacement horizontal:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v - Un caractère d'espacement vertical:

[\n\x0B\f\r\x85\u2028\u2029]

Mais je suis conscient que vous utilisez .NET. Ma réponse au remplacement de chaque espace vertical est donc ...

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");
Kang Andrew
la source
Cela ressemble à une réponse à une autre question ... et sans référence réelle ...
Alexei Levenkov
-4

Vous pouvez utiliser Trimsi vous souhaitez supprimer du début et de la fin.

string stringWithoutNewLine = "\n\nHello\n\n".Trim();
Ankit Arya
la source
-6

Pour info,

Trim () le fait déjà.

L'exemple LINQPad suivant:

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

Les sorties:

23
18
Lnaie
la source
5
Cela ne supprime pas le \ n au milieu.
FlappySocks