Announcement

Collapse
No announcement yet.

String mit Trennzeichen und Begrenzern zerlegen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • String mit Trennzeichen und Begrenzern zerlegen

    Einen schönen guten Tag zusammen! Hoffentlich kann mir hier jemand weiter helfen!

    Folgender String muß zerlegt werden:
    ^TEST^,^TEST2^,^TEST3^

    Es muß also später TEST TEST2 TEST3 rauskommen.

    Jetzt könnte man meinen, Trim und Split reichen hier aus. Der String könnte aber auch so aussehen:
    ^TEST^,^TEST2^,^TEST3,TEST4^

    Dann müsste folgendes rauskommen: TEST TEST2 TEST3,TEST4

    Komme da absolut nicht weiter. Hat jemand eine Idee?

  • #2
    Hallo,

    für solche Aufgaben sind Reguläre Ausdrücke ideal (Regex).

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo,

      String.Split mit ^,^ als Trenner, und zwar die Überladung mit einem String-Array als erstem Argument. Beim ersten Ergebnis-String wird das ^ am Anfang und beim letzten das ^ am Ende entfernt.

      Gü hat höchstwahrscheinlich recht mit seinem Hinweis auf RegEx, aber so geht es auch.

      Jürgen

      Comment


      • #4
        Regex zum Splitten

        Der Code dazu. Es sind beide Varianten (Regex und String.Split) gezeigt.

        C#-Version (VB.net-Version weiter unten):
        [highlight=c#]
        using System.Collections.Generic;
        using System.Text.RegularExpressions;

        namespace ConsoleApplication1
        {
        class Program
        {
        static void Main(string[] args)
        {
        string string1 = "^TEST^,^TEST2^,^TEST3^";
        string string2 = "^TEST^,^TEST2^,^TEST3,TEST4^";

        IEnumerable<string> splitted1 = RegexSplit(string2);
        IEnumerable<string> splitted2 = StringSplit(string2);
        }
        //---------------------------------------------------------------------
        public static IEnumerable<string> RegexSplit(string input)
        {
        MatchCollection matches = Regex.Matches(input, @"\w+");
        List<string> result = new List<string>(matches.Count);
        foreach (Match m in matches)
        result.Add(m.Value);

        return result;
        }
        //---------------------------------------------------------------------
        private static IEnumerable<string> StringSplit(string input)
        {
        string[] tmp = input.Split(',');
        List<string> result = new List<string>(tmp.Length);
        foreach (string s in tmp)
        result.Add(s.Replace("^", string.Empty));

        return result;
        }
        }
        }
        [/highlight]

        VB.net-Version:
        [highlight=vbnet]
        Imports System.Collections.Generic
        Imports System.Text.RegularExpressions

        Namespace ConsoleApplication1
        * * Class Program
        * * * * Private Shared Sub Main(ByVal args As String())
        * * * * * * Dim string1 As String = "^TEST^,^TEST2^,^TEST3^"
        * * * * * * Dim string2 As String = "^TEST^,^TEST2^,^TEST3,TEST4^"
        * * * * * *
        * * * * * * Dim splitted1 As IEnumerable(Of String) = RegexSplit(string2)
        * * * * * * Dim splitted2 As IEnumerable(Of String) = StringSplit(string2)
        * * * * End Sub
        * * * * '---------------------------------------------------------------------
        * * * * Public Shared Function RegexSplit(ByVal input As String) As IEnumerable(Of String)
        * * * * * * Dim matches As MatchCollection = Regex.Matches(input, "\w+")
        * * * * * * Dim result As New List(Of String)(matches.Count)
        * * * * * * For Each m As Match In matches
        * * * * * * * * result.Add(m.Value)
        * * * * * * Next
        * * * * * *
        * * * * * * Return result
        * * * * End Function
        * * * * '---------------------------------------------------------------------
        * * * * Private Shared Function StringSplit(ByVal input As String) As IEnumerable(Of String)
        * * * * * * Dim tmp As String() = input.Split(","c)
        * * * * * * Dim result As New List(Of String)(tmp.Length)
        * * * * * * For Each s As String In tmp
        * * * * * * * * result.Add(s.Replace("^", String.Empty))
        * * * * * * Next
        * * * * * *
        * * * * * * Return result
        * * * * End Function
        * * End Class
        End Namespace
        [/highlight]

        Anmerkung: Reguläre Ausdrücke scheine etwas kompliziert es gabt aber riesen Bibliotheken im Netz in denen für die meisten Anwendungsfälle die Infos gefunden werden.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Mit \w+ erwischst du das Komma nicht. \w bezieht sich ja nur auf alphanummerische Zeichen.

          Ich denke man muß schon auf die ^ testen und dazwischen alles ohne ^ zulassen.


          Code:
          string text = "^TEST^,^TEST2^,^TEST3,TEST4^";
          
          List<string> result = new List<string>();
          foreach (Match match in Regex.Matches(text, @"\^(?<hit>[^\^]*)\^"))
          {
                string hit = match.Result(@"${hit}");               
                result.Add(hit);
          }
          Mit dem Code von Gü und meinem C# solltest du dir eine passende Regex Lösung auch in VB zusammenreimen können.

          Comment


          • #6
            Ralf hat recht.

            Ich hab die Besonderheit bei TEST3,TEST4 übersehen


            mfG Gü

            PS: Bis nächsten Donnerstag
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Vielen, vielen Dank @all!

              Ich habe auch schon mit regex herum experementiert, aber es hat nie richtig funktioniert. Werde mir regex-string mal genauer ansehen.

              Comment

              Working...
              X