RegEx-Problem

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Mandy.

    RegEx-Problem

    Hallo,

    ich habe da eine Denksportaufgabe der anderen Art: :D

    Ich habe Zeichenfolgen der folgenden Art:
    1:1
    17:28,30
    7:8,10-12,19:28

    Jede Folge beginnt immer mit (\d:\d), das ist noch einfach...
    Aaaber,
    wenn nach dem Doppelpunkt mehrere Zahlen kommen,
    brauche ich folgende Gruppierung (Bsp. letzte Zeile):
    (7)(8,)(10-)(12)
    (19)(28)

    Also die Zahl vor dem Doppelpunkt startet immer einen Ausdruck,
    die Zahlen nach dem Doppelpunkt sollen jeweils eigene Groups bilden, mit dem Trennzeichen dazu.
    Ob die letzte Zahl (12 im Bsp.) jetzt mit oder ohne Trennzeichen ist mir egal.

    Geht das über RegEx? Ich komm nicht dahinter.
    Oder soll ich das traditionell Zeichen für Zeichen parsen?

    Danke,
    Manfred
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    Zeig doch mal was du Dir letzendlich für Strings vorstellst.

    Könnte mir Vorstellen, dass du folgendes meinst?

    19:4500

    VB.NET-Quellcode

    1. (\d+):(\d+)
    oder wenn Du überall die Doppelpunkte erlauben willst dann

    VB.NET-Quellcode

    1. ([:\d]+)

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

    Kevin Hombre schrieb:

    Zeig doch mal was du letzendlich für Strings vorstellst.
    ?(

    Mandy schrieb:

    wenn nach dem Doppelpunkt mehrere Zahlen kommen,
    brauche ich folgende Gruppierung (Bsp. letzte Zeile):
    (7)(8,)(10-)(12)
    (19)(28)
    Genau so stell ich mir das vor.
    Jede Klammer entspricht einer RegEx-Gruppe
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    \d+ beschreibt das mehrere Ziffern aufeinander folgen, bildet aber keine Gruppe
    Mit () bildest du eine Gruppe(Group).

    Haben wir jetzt beispielsweise:

    VB.NET-Quellcode

    1. '18:4500
    2. '\d{1,2}:(\d+)
    3. '\d{1,2} beschreibt maximal 2 Ziffern, minimal 1 Ziffer
    4. '(\d+) heißt mehrere Ziffern folgen aufeinander , die sind hierbei in einer Group wegen den Klammern
    5. 2. Beispiel
    6. '1:8700 -> \d:(\d+)
    7. '\d bedeutet eine Ziffer von 0-9 dann folgt der Doppelpunkt und (\d+) heißt es folgt eine Ziffernreihe.

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

    Hallo Kevin,

    ich habe eigentlich nicht nach einem Grundlagenkurs in regulären Ausdrücken gefragt.

    Oben ist ein konkretes Problem beschrieben, das ich nicht lösen kann.
    Was Gruppen sind, und wie ich die : trenne ist mir schon klar.

    Danke trotzdem,
    Mandy
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    Hm so ganz versteh ich dein Vorhaben irgendwie nicht.


    Meinst Du so?

    VB.NET-Quellcode

    1. Test:7:8,10-12,19:28
    2. 'Test ist hierbei der Ausdruck, danach folgt ein: und es geht los.
    3. Test:([:\d]+),([\d-]+),([:\d]+)


    Hierbei hättest Du jetzt
    7:8(Group1)
    10-12(Group2)
    19:28(Group3)
    Ich habe Zeichenfolgen der folgenden Art:

    1:1

    17:28,30

    7:8,10-12,19:28


    Daraus soll werden:
    a as string = {"1", "1"}
    a as string = {"17", "28,", "30"}

    im dritten Fall, da ein weiterer ':' vorkommt zwei Arrays (können möglicherweise auch 3 oder 4 sein)
    a as string = {"7", "8,", "10-", "12,"}
    b as string = {"19", "28"}

    Der erste Eintrag im Array ist immer eine Zahl VOR dem ':'
    Die anderen Zahlen werden dann nur mehr aufgetrennt.

    Mein Problem ist, dass ich im reg.Ausdruck die Zahl vor dem ':' nicht erkenne
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    mit einem Regex, der eine ganze Zeile fassen soll geht das nicht.

    Weil es müssten ja verschieden viele Gruppen entstehen.

    Also versuche einen Regex zu bauen, der verschiedene Gruppen oder-verknüpft matcht.

    sodass du am Ende eine matchcollection erhälst, uind jeder Match enthält eine Zahl.

    müssen eiglich die gruppen sich unterscheiden, in Abhängigkeit von den drumrumstehenden zeichen, oder wäre das egal?
    HalloErfinderDesRades,

    vielen Dank für den Hinweis.

    Wichtig ist eigentlich nur der Start mit der Zahl vor dem ':', die bleibt solange gleich, bis eine neue Zahl mit ':' kommt.

    Die nachfolgenden Zahlen geben einzelne Abschnitte oder Abschnittsbereiche an.
    Wenn ich ',' oder '-' nach der Zahl habe weiß ich genau das noch eine Zahl kommt, und ob es eine einzelne Zahl oder eine Bereichsangabe ist.

    Ich werd mich nochmal herumspielen damit.

    Danke,
    Manfred
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    eher (\d+[:,-]*)
    kann ich aber erst am Abend in der Praxis testen
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:

    Mandy schrieb:

    Werd mir aber deinen am Abend ansehen.

    Tja, man bricht sich entweder nächtelang mit RegEx die Füße, oder man tut, was Programmierer tun ...

    VB.NET-Quellcode

    1. Dim s As String = "1:1,10-12,3:9"
    2. Dim sb As New System.Text.StringBuilder
    3. Dim result As New List(Of List(Of String))
    4. For Each c In s
    5. Select Case True
    6. Case c.Equals(":"c)
    7. result.Add(New List(Of String) From {sb.ToString})
    8. sb.Clear()
    9. Case Char.IsNumber(c)
    10. sb.Append(c)
    11. Case Else
    12. sb.Append(c)
    13. result(result.Count - 1).Add(sb.ToString)
    14. sb.Clear()
    15. End Select
    16. Next
    17. If sb.Length > 0 Then result(result.Count - 1).Add(sb.ToString)

    picoflop schrieb:

    Tja, man bricht sich entweder nächtelang mit RegEx die Füße, oder man tut, was Programmierer tun ...
    Nächtelang sicher nicht, und es gibt viele Dinge, die mit RegEx einfach schöner und eleganter funktionieren.
    Deshalb sind solche Tools einfach praktisch.

    Aber du hast mir die Antwort auf meine Frage geliefert:
    Besser traditionelle Programmierung...

    Danke allen für das Kopfzerbrechen und diskutieren :thumbsup:
    Mandy
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup: