Regex Anfängerhilfe

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von PatVo.

    Regex Anfängerhilfe

    Neu

    Guten Abend liebe Damen und Herren,

    ich bin ein Anfänger in VB und ein noch viel blutigerer in Sachen "RegEx".
    Aktuell befinde ich mich im "Learning-by-doing"-Prozess und bastle mir meinen Code durch Starthilfen und Beispiele aus dem Netz zusammen wie ich ihn brauche, während ich verstehe, wie das Ganze funktioniert.
    Nun bin ich an einen Punkt gestoßen, an dem ich zum allerersten Mal "RegEx" benötige.
    Es geht um einen Text folgenden Aufbaus:

    [...]data-park-title="Audi RS3" data-park-price-currency="EUR" data-park-price-amount="49570"><span class="btn btn--success btn--unpark btn--s"><i class="gicon-parking-active-s class="rbt-regMilPow">EZ 01/2016, 3.000 km
    [...]data-park-title="Audi RS4 quattro" data-park-price-currency="EUR" data-park-price-amount="60690"><span class="btn btn--success btn--unpark btn--s"><i class="gicon-parking-active-s class="rbt-regMilPow">EZ 05/2018, 13.000 km
    [...]data-park-title="Audi RS5 Sportback quattro Ceramic DYNAMIK" data-park-price-currency="EUR" data-park-price-amount="74690"><span class="btn btn--success btn--unpark btn--s"><i class="gicon-parking-active-s class="rbt-regMilPow">EZ 07/2019, 5.300 km
    [...]

    Wie ihr seht, handelt es sich um mehrere Fahrzeuge, gefolgt von ihren Daten. Ich unterscheide zwischen Titel, Preis, Laufleistung, ErstzulassungMonat, ErstzulassungJahr

    Diese Daten möchte ich gerne aus dem Gesamttext für jedes Fahrzeug filtern und in mein DataGridView1 als jeweilige Zeile einfügen.

    Nach den Einzeldaten filtere ich nun folgendermaßen:

    VB.NET-Quellcode

    1. 'Filtern nach Titel
    2. Dim rx1 As New Regex("(?<=\bdata-park-title\b.)(.*?)(?=\bdata-park-price-currency\b)", RegexOptions.IgnoreCase)
    3. 'Filtern nach Preis
    4. Dim rx2 As New Regex("\bdata-park-price-amount\b..(\d+)", RegexOptions.IgnoreCase)
    5. 'Filtern nach Laufleitsung
    6. Dim rx3 As New Regex("(?<=\bregMilPow\b..............)(.*?)(?=\b.km\b)", RegexOptions.IgnoreCase)
    7. 'Filtern nach Erstzulassung
    8. Dim rx4 As New Regex("\bregMilPow\b.....(\d+).(\d+)", RegexOptions.IgnoreCase)
    9. 'quelltext ist der Name des Textes, aus dem gefiltert werden soll
    10. Dim Titeltreffer As MatchCollection = rx1.Matches(quelltext)
    11. Dim Preistreffer As MatchCollection = rx2.Matches(quelltext)
    12. Dim Kilometertreffer As MatchCollection = rx3.Matches(quelltext)
    13. Dim EZtreffer As MatchCollection = rx4.Matches(quelltext)
    14. For Each a As Match In Titeltreffer
    15. Dim Titel = a.Groups(1).Value
    16. 'etc.


    Mit dem "For Each"-Befehl würde ich schließlich den gesamten Text nach allen Fahrzeugen abscannen und mir so nacheinander alle Matches aus dem Regex in ein DataGridView schmeißen lassen.
    Dass ich jedoch 4 verschiedene Regex's mit jeweils nur 1 Group (okay, die 4. Regex hat 2 Groups, nämlich "Monat" und "Jahr") dafür benötige, taugt mir nicht.
    Ich versuche deshalb alle informationen zu einem Fahrzeug in einer Regex mit 5 Groups abzufragen.

    Kann mir jemand behilflich sein, wie ich meine Regular Expressions zu einer zusammenfassen kann? Habe online mit einem Regex Tester bereits viel probiert, komme jedoch nicht auf das gewünschte Ergebnis.

    Vielen Dank im Voraus für jede Hilfe.

    *Da offenbar VB.NET, Label und BBCode angepasst*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Neu

    ach - bei regex neigt man leicht dazu, mords-komplizierte eierlegende wollmilchsäue züchten zu wollen.
    Ich bin da eher für einfacherere Pattern, die man dann iwie anners nacharbeiten muss.
    Also die 3 Elemente täte ich so identifizieren:

    VB.NET-Quellcode

    1. private rgx As new Regex("title=""([^""]+).+?amount=""([^""]+).+?rbt-regMilPow""\>(.+?)km", RegexOptions.IgnoreCase)
    2. '...
    3. dim matches = rgx.Matches(quelltext)
    und in jedem Match findet sich in 3 Gruppen was interessantes zum weiter auswerten.
    In meim Regextester stellen sich die 3 Matches dann so dar:

    Mit WebSites ists ja auch immer das Problem, dass die nach 1 - 2 Monaten umgemodelt werden, und man kann das Auslesen von vorne anfangen.