Comment puis-je remplacer plusieurs espaces par un seul espace en C#?

Comment puis-je remplacer plusieurs espaces dans une chaîne avec un seul espace en C#?

exemple:

1 2 3  4    5

serait:

1 2 3 4 5
365
demandé sur uınbɐɥs 2008-10-16 02:10:31

21 réponses

RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
tempo = regex.Replace(tempo, " ");
385
répondu Patrick Desjardins 2016-02-03 11:27:56

j'aime à utiliser:

myString = Regex.Replace(myString, @"\s+", " ");

Puisqu'il capturera des passages de n'importe quel type d'espace blanc (par exemple tabs, newlines, etc.) et les remplacer par un seul espace.

528
répondu Matt 2008-10-15 23:58:12
string xyz = "1   2   3   4   5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
37
répondu tvanfosson 2008-10-15 22:12:52

je pense que la réponse de Matt est la meilleure, mais je ne crois pas que ce soit tout à fait juste. Si vous voulez remplacer newlines, vous devez utiliser:

myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
37
répondu Brenda Bell 2010-05-20 22:07:09

c'est beaucoup plus simple que tout cela:

while(str.Contains("  ")) str = str.Replace("  ", " ");
21
répondu Joel Coehoorn 2012-11-08 07:09:50

une autre approche qui utilise LINQ:

 var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);
20
répondu Cuong Le 2012-08-14 07:23:16

Regex peut être assez lent même avec des tâches simples. Cela crée une méthode d'extension qui peut être utilisée hors de n'importe quel string .

    public static class StringExtension
    {
        public static String ReduceWhitespace(this String value)
        {
            var newString = new StringBuilder();
            bool previousIsWhitespace = false;
            for (int i = 0; i < value.Length; i++)
            {
                if (Char.IsWhiteSpace(value[i]))
                {
                    if (previousIsWhitespace)
                    {
                        continue;
                    }

                    previousIsWhitespace = true;
                }
                else
                {
                    previousIsWhitespace = false;
                }

                newString.Append(value[i]);
            }

            return newString.ToString();
        }
    }

il serait utilisé comme tel:

string testValue = "This contains     too          much  whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."
17
répondu ScubaSteve 2015-11-20 02:00:01
myString = Regex.Replace(myString, " {2,}", " ");
14
répondu Jan Goyvaerts 2008-11-20 07:20:54

Pour ceux qui n'aiment pas Regex , voici une méthode qui utilise le StringBuilder :

    public static string FilterWhiteSpaces(string input)
    {
        if (input == null)
            return string.Empty;

        StringBuilder stringBuilder = new StringBuilder(input.Length);
        for (int i = 0; i < input.Length; i++)
        {
            char c = input[i];
            if (i == 0 || c != ' ' || (c == ' ' && input[i - 1] != ' '))
                stringBuilder.Append(c);
        }
        return stringBuilder.ToString();
    }

dans mes tests, cette méthode était 16 fois plus rapide en moyenne avec un très grand ensemble de chaînes de taille petite à moyenne, comparé à un Regex compilé statique. Comparé à un Regex non compilé ou non statique, cela devrait être encore plus rapide.

Gardez à l'esprit, qu'il ne pas supprimer ou les espaces, seulement plusieurs occurrences de tels.

8
répondu Nolonar 2013-05-27 15:16:35

vous pouvez simplement faire cela dans une solution de ligne!

string s = "welcome to  london";
s.Replace(" ", "()").Replace(")(", "").Replace("()", " ");

Vous pouvez choisir d'autres supports (ou même d'autres caractères) si vous le souhaitez.

8
répondu ravish.hacker 2015-06-24 16:51:50

c'est une version plus courte, qui ne doit être utilisée que si vous ne le faites qu'une fois, car elle crée une nouvelle instance de la classe Regex à chaque fois qu'elle est appelée.

temp = new Regex(" {2,}").Replace(temp, " "); 

si vous n'êtes pas trop familier avec les expressions régulières, voici une brève explication:

le {2,} effectue la recherche regex pour le caractère qui le précède, et trouve des substrats entre 2 et des temps illimités.

Le .Replace(temp, " ") remplace toutes les allumettes de la chaîne temp par un espace.

si vous voulez l'utiliser plusieurs fois, voici une meilleure option, car elle crée le fichier au moment de la compilation:

Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
5
répondu somebody 2017-10-16 18:14:18

Consolodating d'autres réponses, par Joel, et nous espérons améliorer légèrement comme je l'aller:

vous pouvez le faire avec Regex.Replace() :

string s = Regex.Replace (
    "   1  2    4 5", 
    @"[ ]{2,}", 
    " "
    );

ou avec String.Split() :

static class StringExtensions
{
    public static string Join(this IList<string> value, string separator)
    {
        return string.Join(separator, value.ToArray());
    }
}

//...

string s = "     1  2    4 5".Split (
    " ".ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries
    ).Join (" ");
4
répondu Jay Bazuzi 2008-10-15 22:55:00

pas de Regex, pas de Linq... supprime les espaces de tête et de queue et réduit les segments d'espace multiples encastrés à un seul espace

string myString = "   0 1 2  3   4               5  ";
myString = string.Join(" ", myString.Split(new char[] { ' ' }, 
StringSplitOptions.RemoveEmptyEntries));

résultat:"0 1 2 3 4 5"

4
répondu Stephen du Buis 2018-01-18 16:39:51

je sais que c'est assez vieux, mais j'ai couru à travers ceci en essayant d'accomplir presque la même chose. J'ai trouvé cette solution dans RegEx Buddy. Ce modèle remplacera tous les espaces doubles par des espaces simples et aussi garnir les espaces de tête et de fuite.

pattern: (?m:^ +| +$|( ){2,})
replacement: 

C'est un peu difficile à lire puisqu'il s'agit d'un espace vide, donc ici c'est à nouveau avec les" espaces "remplacés par un"_".

pattern: (?m:^_+|_+$|(_){2,})  <-- don't use this, just for illustration.

La "(?m: "la construction permet la option" multi-ligne". J'aime généralement inclure toutes les options que je peux dans le modèle lui-même afin qu'il soit plus autonome.

2
répondu Paul Easter 2014-07-20 05:07:11

je viens d'écrire un nouveau Join que j'aime, donc j'ai pensé que je vais re-répondre, avec elle:

public static string Join<T>(this IEnumerable<T> source, string separator)
{
    return string.Join(separator, source.Select(e => e.ToString()).ToArray());
}

une des choses cool à ce sujet est qu'il fonctionne avec des collections qui ne sont pas des chaînes, en appelant ToString() sur les éléments. L'Usage est toujours le même:

//...

string s = "     1  2    4 5".Split (
    " ".ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries
    ).Join (" ");
1
répondu Jay Bazuzi 2008-10-20 17:40:24

je peux enlever les espaces blancs avec ce

while word.contains("  ")  //double space
   word = word.Replace("  "," "); //replace double space by single space.
word = word.trim(); //to remove single whitespces from start & end.
1
répondu Learner1947 2016-02-11 10:24:29

beaucoup de réponses fournissent la bonne sortie, mais pour ceux qui recherchent les meilleures performances, j'ai amélioré réponse de Nolanar (qui était la meilleure réponse pour la performance) d'environ 10%.

public static string MergeSpaces(this string str)
{

    if (str == null)
    {
        return null;
    }
    else
    {
        StringBuilder stringBuilder = new StringBuilder(str.Length);

        int i = 0;
        foreach (char c in str)
        {
            if (c != ' ' || i == 0 || str[i - 1] != ' ')
                stringBuilder.Append(c);
            i++;
        }
        return stringBuilder.ToString();
    }

}
1
répondu The_Black_Smurf 2018-02-27 20:04:00

essayez cette méthode

private string removeNestedWhitespaces(char[] st)
{
    StringBuilder sb = new StringBuilder();
    int indx = 0, length = st.Length;
    while (indx < length)
    {
        sb.Append(st[indx]);
        indx++;
        while (indx < length && st[indx] == ' ')
            indx++;
        if(sb.Length > 1  && sb[0] != ' ')
            sb.Append(' ');
    }
    return sb.ToString();
}

utilisez - le comme ceci:

string test = removeNestedWhitespaces("1 2 3  4    5".toCharArray());
1
répondu Ahmed A. Ibrahim 2018-08-26 22:02:31

Old skool:

string oldText = "   1 2  3   4    5     ";
string newText = oldText
                    .Replace("  ", " " + (char)22 )
                    .Replace( (char)22 + " ", "" )
                    .Replace( (char)22 + "", "" );

Assert.That( newText, Is.EqualTo( " 1 2 3 4 5 " ) );
0
répondu onedaywhen 2012-11-30 09:26:26

sans utiliser d'expressions régulières:

while (myString.IndexOf("  ", StringComparison.CurrentCulture) != -1)
{
    myString = myString.Replace("  ", " ");
}

OK à utiliser sur les cordes courtes, mais mal performer sur les cordes longues avec beaucoup d'espaces.

0
répondu Tom Gullen 2016-02-16 18:38:09

utiliser le motif regex

    [ ]+    #only space

   var text = Regex.Replace(inputString, @"[ ]+", " ");
0
répondu M.Hassan 2018-08-23 14:50:24