Aus String Leerzeile entfernen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Aus String Leerzeile entfernen

    Hallo,
    Ich habeein kleines Problem mit der Replace() funktion. Ich habe einen String, aus dem ein Teil entfernt wird. Mein Problem ist, dass ich zwar den Text entfernen kann aber nicht die Leerzeile.

    Ein Beispiel:

    permissions:
    - essentials.spawn
    - essentials.motd
    - essentials.help
    - essentials.home
    - essentials.sethome

    Aus diesem Teil wird z.b. - essentials.home entfernt ( mit der replace funktion )
    Übirg bleibt :

    permissions:
    - essentials.spawn
    - essentials.motd
    - essentials.help

    - essentials.sethome

    Wie kann ich nun die Leerzeile entfernen?
    Mein Versuch:

    VB.NET-Quellcode

    1. TempSave.Text = System.Text.RegularExpressions.Regex.Replace(BeispielString, vbCrLf & vbCrLf, vbCrLf, System.Text.RegularExpressions.RegexOptions.IgnoreCase)


    MFG Renixor
    Einfache Methode:

    VB.NET-Quellcode

    1. Dim in As String = "Inhalt"
    2. in = String.Join(vbCrLf, in.Split(vbCrLf, StringSplitOptions.RemoveEmptyEntries))
    Das setzt allerdings voraus, dass vbCrLf als Zeilentrennzeichen verwendet wird. Das trifft für Text in einer RichTextBox nicht zu, dort ist es vbLf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    bla schrieb:

    und was wäre mit vbnewline?
    Nein, das ist vbCr.

    VB.NET-Quellcode

    1. Dim dd As Integer = Asc(vbNewLine)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    leute da ihr anscheinend nicht gesehen habt das er fertig ist:

    Danke
    Habs hinbekommen danke.

    MFG Renixor


    PS: hier die lösung war die zeilen der datei alle in eine liste (list(of string)) zu laden und dort drin zu bearbeiten etc.
    Also ich hab's schon gelesen, aber ich hab' mir auch gedacht, dass die "Lösung" nicht so schön anzusehen ist.

    VB.NET-Quellcode

    1. Public Shared Function RemoveEmptyLines(ByVal value As String) As String
    2. Dim sb As New System.Text.StringBuilder(value.Length)
    3. Dim enr As IEnumerator(Of Char) = value.GetEnumerator()
    4. 'Behaelt alle zweistelligen Kombinationen von Lf und Cr bei
    5. While enr.MoveNext()
    6. sb.Append(enr.Current) 'Buchstaben in den neuen Puffer schreiben
    7. If enr.Current = ChrW(10) Then 'lf erreicht
    8. If enr.MoveNext() Then 'bei weiteren Buchstaben
    9. If enr.Current = ChrW(10) Then 'lflf
    10. While enr.MoveNext() AndAlso (enr.Current = ChrW(13) OrElse enr.Current = ChrW(10)) 'restliche Lfs&Crs auslassen
    11. End While
    12. sb.Append(enr.Current) 'nachfolgenden Buchstaben rausschreiben
    13. Else
    14. sb.Append(enr.Current) 'neuen Buchstaben rausschreiben
    15. If enr.Current = ChrW(13) Then 'lfcr
    16. While enr.MoveNext() AndAlso (enr.Current = ChrW(13) OrElse enr.Current = ChrW(10)) 'restliche Lfs&Crs auslassen
    17. End While
    18. sb.Append(enr.Current) 'nachfolgenden Buchstaben rausschreiben
    19. End If
    20. End If
    21. End If
    22. ElseIf enr.Current = ChrW(13) Then 'cr erreicht
    23. If enr.MoveNext() Then 'bei weiteren Buchstaben
    24. If enr.Current = ChrW(13) Then 'crcr
    25. While enr.MoveNext() AndAlso (enr.Current = ChrW(13) OrElse enr.Current = ChrW(10)) 'restliche Lfs&Crs auslassen
    26. End While
    27. sb.Append(enr.Current) 'nachfolgenden Buchstaben rausschreiben
    28. Else
    29. sb.Append(enr.Current) 'neuen Buchstaben rausschreiben
    30. If enr.Current = ChrW(10) Then 'crlf
    31. While enr.MoveNext() AndAlso (enr.Current = ChrW(13) OrElse enr.Current = ChrW(10)) 'restliche Lfs&Crs auslassen
    32. End While
    33. sb.Append(enr.Current) 'nachfolgenden Buchstaben rausschreiben
    34. End If
    35. End If
    36. End If
    37. End If
    38. End While
    39. Return sb.ToString()
    40. End Function


    Per Zeiger wäre es in C# noch mal schneller.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    vbNewLine ist NICHT vbCr.
    Intention war, dass es nicht vbLf ist, also bei einer RTB nicht greift.
    Deswegen würde ich dies nicht benutzen, bei mir muss genau das da stehen, was es auch ist. Unabhängig vom System.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Samus Aran schrieb:

    Kennt hier jemand Environment.NewLine?
    Die greift halt nicht bei RTB. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Insgesamt ist Environment.NewLine das "Beste". Üblicherweise ist das Beste aber fallabhängig. Ich weiß nicht, wie's bei der RTB ist, aber im Normalfall gilt, dass ein Zeilenumbruch entweder bei einem Cr, Lf, CrLf oder LfCr durchgeführt wird. Bei meiner Variante sollten alle diese Fälle behandelt werden und jedes anschließende Zeichen dieser Art ignoriert werden. Wenn die RTB jetzt sowohl bei Cr, als auch bei Lf einen Zeilenumsprung durchführt und aber gleichzeitig bei LfCr und CrLf gleich zwei, funktioniert mein Code natürlich ebenfalls nicht. Im Normalfall sollte man Environment.NewLine verwenden und das sollte auf Windows-Systemen äquivalent zu vbCrLf, aber moderner sein.

    Gruß
    ~blaze~
    Das liegt am RichTextFormat, das ist halt so definiert.
    Beimm Reinschreiben werden all die Zeilenvorschübe in ein vbLf konvertiert, beim Auslesen sind da nur noch vbLf's drin.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!