it-swarm.com.de

Wie ersetze ich mehrere Leerzeichen durch ein einzelnes Leerzeichen in C #?

Wie kann ich mehrere Leerzeichen in einer Zeichenfolge durch nur ein Leerzeichen in C # ersetzen?

Beispiel:

1 2 3  4    5

wäre:

1 2 3 4 5
387
Pokus
RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
tempo = regex.Replace(tempo, " ");
400

Ich benutze gerne:

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

Da es Läufe jeglicher Art von Leerzeichen (z. B. Registerkarten, Zeilenumbrüche usw.) fängt und durch ein einzelnes Leerzeichen ersetzt.

548
Matt
string xyz = "1   2   3   4   5";
xyz = string.Join( " ", xyz.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ));
38
tvanfosson

Ich denke, dass Matt die beste Antwort ist, aber ich glaube nicht, dass es richtig ist. Wenn Sie Zeilenumbrüche ersetzen möchten, müssen Sie Folgendes verwenden:

myString = Regex.Replace(myString, @"\s+", " ", RegexOptions.Multiline);
37
Brenda Bell

Ein anderer Ansatz, der LINQ verwendet:

 var list = str.Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));
 str = string.Join(" ", list);
22
cuongle

Es ist viel einfacher als das alles:

while(str.Contains("  ")) str = str.Replace("  ", " ");
21
Joel Coehoorn

Regex kann auch bei einfachen Aufgaben ziemlich langsam sein. Dadurch wird eine Erweiterungsmethode erstellt, die von jeder string verwendet werden kann. 

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

Es würde als solches verwendet werden:

string testValue = "This contains     too          much  whitespace."
testValue = testValue.ReduceWhitespace();
// testValue = "This contains too much whitespace."
19
ScubaSteve
myString = Regex.Replace(myString, " {2,}", " ");
14
Jan Goyvaerts

Für diejenigen, die Regex nicht mögen, ist hier eine Methode, die StringBuilder verwendet:

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

In meinen Tests war diese Methode im Vergleich zu einer statisch kompilierten Regex im Durchschnitt 16-mal schneller mit einem sehr großen Satz von kleinen bis mittelgroßen Saiten. Verglichen mit einem nicht kompilierten oder nicht statischen Regex sollte dies noch schneller sein.

Denken Sie daran, dass nicht führende oder nachfolgende Leerzeichen entfernt, nur mehrere Vorkommen von solchen.

9
Nolonar

Sie können dies einfach in einer Lösung tun!

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

Sie können andere Klammern (oder sogar andere Zeichen) auswählen, wenn Sie möchten.

8
ravish.hacker

no Regex, no Linq ... entfernt führende und nachgestellte Leerzeichen und reduziert alle eingebetteten Segmente auf ein Leerzeichen

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

ergebnis: "0 1 2 3 4 5"

5
Stephen du Buis

Dies ist eine kürzere Version, die nur verwendet werden sollte, wenn Sie dies nur einmal ausführen, da bei jedem Aufruf eine neue Instanz der Regex-Klasse erstellt wird.

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

Wenn Sie nicht mit regulären Ausdrücken vertraut sind, finden Sie hier eine kurze Erklärung:

Mit dem {2,} sucht der Regex nach dem vorangehenden Zeichen und findet Teilzeichenfolgen zwischen 2 und unbegrenzten Zeiten.
.__ Die .Replace(temp, " ") ersetzt alle Übereinstimmungen im String-Temp durch ein Leerzeichen.

Wenn Sie dies mehrmals verwenden möchten, ist hier die bessere Option, da die Regex-IL zur Kompilierzeit erstellt wird:

Regex singleSpacify = new Regex(" {2,}", RegexOptions.Compiled);
temp = singleSpacify.Replace(temp, " ");
5
somebody

Andere Antworten konsolidieren, pro Joel, und hoffentlich ein wenig besser, wenn ich gehe:

Sie können dies mit Regex.Replace() tun:

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

Oder mit 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
Jay Bazuzi

Ich habe gerade eine neue Join geschrieben, die mir gefällt, also dachte ich, ich würde noch einmal antworten:

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

Das Coole daran ist, dass es mit Sammlungen arbeitet, die keine Strings sind, indem ToString () für die Elemente aufgerufen wird. Die Nutzung ist immer noch gleich:

//...

string s = "     1  2    4 5".Split (
    " ".ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries
    ).Join (" ");
3
Jay Bazuzi

Ich weiß, dass das ziemlich alt ist, aber ich bin auf das gestoßen, als ich versuchte, fast dasselbe zu erreichen. Diese Lösung wurde in RegEx Buddy gefunden. Dieses Muster ersetzt alle doppelten Leerzeichen durch einzelne Leerzeichen und schneidet auch führende und nachfolgende Leerzeichen ab.

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

Es ist ein wenig schwer zu lesen, da es sich um leere Räume handelt, daher werden hier wieder "Leerzeichen" durch ein "_" ersetzt. 

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

Das Konstrukt "(? M:") aktiviert die Option "mehrzeilig". Im Allgemeinen möchte ich alle möglichen Optionen in das Muster einschließen, sodass es mehr in sich geschlossen ist.

2
Paul Easter

probiere diese Methode  

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

benutze es so: 

string test = removeNestedWhitespaces("1 2 3  4    5".toCharArray());
1
Ahmed Aljaff

Ich kann damit Leerzeichen entfernen 

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
Learner1947

Viele Antworten liefern den richtigen Output, aber für diejenigen, die die besten Leistungen erwarten, habe ich Nolanars Antwort (was die beste Antwort für die Leistung war) um etwa 10% verbessert.

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
The_Black_Smurf

Alte Schule:

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
onedaywhen

Verwenden Sie das Regex-Muster 

    [ ]+    #only space

   var text = Regex.Replace(inputString, @"[ ]+", " ");
0
M.Hassan

Ohne reguläre Ausdrücke zu verwenden:

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

OK für kurze Saiten, aber bei langen Saiten mit vielen Leerzeichen schlecht.

0
Tom Gullen

Mix aus StringBuilder und Enumerable.Aggregate () als Erweiterungsmethode für Strings:

using System;
using System.Linq;
using System.Text;

public static class StringExtension
{
    public static string StripSpaces(this string s)
    {
        return s.Aggregate(new StringBuilder(), (acc, c) =>
        {
            if (c != ' ' || acc.Length > 0 && acc[acc.Length-1] != ' ')
                acc.Append(c);

            return acc;
        }).ToString();
    }

    public static void Main()
    {
        Console.WriteLine("\"" + StringExtension.StripSpaces("1   Hello       World  2   ") + "\"");
    }
}

Eingang:

"1   Hello       World  2   "

Ausgabe:

"1 Hello World 2 "
0
Patrick Artner
      // Mysample string
            string str ="hi you           are          a demo";

            //Split the words based on white sapce
            var demo= str .Split(' ').Where(s => !string.IsNullOrWhiteSpace(s));

            //Join the values back and add a single space in between
                    str = string.Join(" ", demo);

//output: string str ="hi you are a demo";
0
JIYAUL MUSTAPHA