Wie effektiv mehrfache Leerzeichen in einem String entfernen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Wie effektiv mehrfache Leerzeichen in einem String entfernen

    Wie kann man effektiv Leerzeichen, von denen mehrere hintereinander in einem String vorkommen können, am entfernen?

    VB.NET-Quellcode

    1. Dim test1 As String = "test mit zu vielen leerzeichen"
    2. Dim test2 As String = test1.Replace(" ", " ")
    3. test2 = test2.Replace(" ", " ")
    4. test2 = test2.Replace(" ", " ")

    Ich hatte erst gedacht das in test2 beim ersten Durchlauf alle doppelten Leerzeichen durch ein einzelnes ersetzt worden wären.
    test2 ist aber erst nach dem dritten Aufruf so wie ich es gerne haben möchte. Das ist mir aber nicht ausreichend, da ich vorher
    nicht weiß wie viele Leerzeichen hintereinander in einem String auftauchen können.

    Wie kann man sowas Narrensicher umsetzen?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    regex wird allerdings, relativ betrachtet, immer ineffektiver, je einfacher die aufgabe wird, die man ihm füttert. regex lieber für qualität statt quantität
    Dann lieber einfach mit einer selbstgebauten Schleife durchlaufen.

    VB.NET-Quellcode

    1. Private Function TrimAll(s As String) As String
    2. Dim myChars As New List(Of Char)
    3. s = s.Trim
    4. For i = 0 To s.Length - 1
    5. If Not (s(i) = " "c AndAlso s(i + 1) = " "c) Then myChars.Add(s(i))
    6. Next
    7. Return New String(myChars.ToArray)
    8. End Function

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    oder die altbewährte Vorgehensweise. (Komisch als ich auf die Seite hier gekommen bi, waren noch keine Antworten vorhanden gewesen.)

    C#-Quellcode

    1. private static void RemoveSpaces(string text)
    2. {
    3. var pattern = " ";
    4. while (true)
    5. {
    6. var idx = text.IndexOf(pattern);
    7. if (idx < 0) break;
    8. text = text.Replace(pattern, " ");
    9. }
    10. }
    Mit Replace sollte man auch mal vergleichen. Der macht manche Sachen doppelt, spart sich aber das hin und her geschiebe mit den Arrays. Bzw. keine Ahnung wie Replace intern funktioniert...
    Ui da kann man sich ganz schön vertun, scheinbar hat Replace genügend andere Sachen zu tun.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Das hab ich jetzt nicht angeschaut. da ist ja wirklich was los.

    Danke für den Hinweis.

    EDIT: Der könnte sogar noch schneller sein als Regex, weil bei mir (dotnet8.0) ist Regex komischerweise sehr unperformant.

    C#-Quellcode

    1. str = str.Trim();
    2. var length = str.Length;
    3. var sb = new StringBuilder(length);
    4. for(var i = 1; i <= length;i++)
    5. if (!char.IsWhiteSpace(str[i - 1]) || !char.IsWhiteSpace(str[i]))
    6. sb.Append(str[i - 1]);
    7. return sb.ToString();


    Für kleine Strings, ist erstaunlicherweise der Weg über string.Split und string.Join schnell.

    C#-Quellcode

    1. var split = str.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    2. return string.Join(" ", split);
    3. //oder so
    4. var trimstr = new[] {'\r', '\n', ' '};
    5. var split = str.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    6. return string.Join(" ", split).Trim(trimstr);


    Gruss

    exc-jdbi

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „exc-jdbi“ ()