Function String.Split - wie schaffe ich es bei einem Split Array die Trennzeichen in den einzelnen Teilstrings zu erhalten

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

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

    Function String.Split - wie schaffe ich es bei einem Split Array die Trennzeichen in den einzelnen Teilstrings zu erhalten

    Hallo Forum,

    habe folgende Aufgabenstellung und suche eine einfache Lösung: Ich möchte die String.Split Funktion verwenden mit einem Array als Trennzeichen(folgen). Die Trenner können variieren. Nachfolgender Code ist also nur ein Beispiel.

    VB.NET-Quellcode

    1. Dim Text as String = "Haus/Ast*Baum!Ei...Bär"
    2. Dim Trenner() As String = {" ", "/","*","...","a1","!","?"}
    3. Dim Einzelstring() As String = Text.Split(Trenner.ToArray, StringSplitOptions.RemoveEmptyEntries)


    Wenn ich die String.Split verwende werden die Einzelstrings wunderbar erzeugt. Allerdings werden (korrekterweise) die Trennzeichen(folgen) gelöscht. Nun möchte ich allerdings die Trennzeichen(folgen) vor jedem Einzelstring erhalten. Das Ergebnis soll dann final so aussehen:

    Einzelstring(0) = "Haus"
    Einzelstring(1) = "/Ast"
    Einzelstring(2) = "*Baum"
    Einzelstring(3) = "!Ei"
    Einzelstring(4) = "...Bär"

    Wie könnte ich das am sinnigsten lösen?

    Danke für Eure Unterstützung.
    Frequentprogrammer
    Hallo Ich würde mittels Regex vorgehen. Das genaue Pattern habe ich noch nicht herausfinden können, aber hier ist mal mein Ansatz:

    VB.NET-Quellcode

    1. Dim Text As String = "Haus/Ast*Baum!Ei...Bär"
    2. Dim pattern = "(?<=[\/\*\!])"
    3. Dim ans = Regex.Split(Text, pattern)


    Resultat:
    Haus/ Ast* Baum! Ei...Bär


    LG
    Bezüglich Regex-Tutorial:
    RegEx Tutorial - Blutige Anfänger und Fortgeschrittene
    Und hier zum Testen:
    regex101.com/
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Frequentprogrammer Ganz einfach:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Me.ListBox1.Items.Clear()
    3. Dim Text As String = "Haus/Ast*Baum!Ei...Bär"
    4. Dim Trenner() As String = {" ", "/", "*", "...", "a1", "!", "?"}
    5. Dim Einzelstring() As String = Text.Split(Trenner.ToArray, StringSplitOptions.RemoveEmptyEntries)
    6. Me.ListBox1.Items.AddRange(Einzelstring)
    7. Me.ListBox1.Items.Add("==============")
    8. Me.ListBox1.Items.Add(Einzelstring(0))
    9. Dim start = Einzelstring(0).Length
    10. For i = 1 To Einzelstring.Length - 1
    11. Dim start2 = Text.IndexOf(Einzelstring(i), start)
    12. start2 += Einzelstring(i).Length
    13. Me.ListBox1.Items.Add(Text.Substring(start, start2 - start))
    14. start = start2
    15. Next
    16. End Sub
    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!
    Hallo Rod,

    manchmal braucht's einfach nur eine zündende Idee.
    Im Falle von Doppelauftreten muss ich jetzt nur noch den identifizierten Einzelstring aus dem Text heraus schneiden bevor ich die Schleife das nächstem Mal durchlaufe, da sonst falsche Trennzeichen eingesetzt werden könnten.

    Danke Frequentprogrammer
    Definiere

    Frequentprogrammer schrieb:

    Doppelauftreten
    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!
    Oder einfach selber machen.
    Pseudo:

    C#-Quellcode

    1. IEnumerable<StringSegment> splitBla(string input, params string[] sep)
    2. {
    3. var inp = (StringSegment)inp;
    4. int start = 0;
    5. for(int i=0;i<inp.Length;i++)
    6. {
    7. foreach(var s in sep)
    8. {
    9. if (i+s.Length >= inp.Length) continue;
    10. if (inp.Subsegment(i, s.Length) == s)
    11. {
    12. yield return inp.Subsegment(start, i + s.Length)
    13. start = i + s.Length;
    14. }
    15. }
    16. yield break;
    17. }
    18. }


    docs.microsoft.com/en-us/dotne…gment?view=aspnetcore-2.1

    man muss natürlich nicht yield verwenden, aber das Prinzip ist dasselbe. Und weniger allocs als bei bisherigen Vorschlägen
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Frequentprogrammer schrieb:

    Teilstrings
    Sind das Einzelstrings oder Trenner?
    Was soll beim Auftreten eines solchen passieren?
    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!