Regex Profi gesucht

  • VB.NET

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

    Regex Profi gesucht

    Hallo liebe Foren-Gemeinde,

    ich bin wirklich seit 1,5 Tagen am Verzweifeln, weil ich folgenes Problem habe:
    Ich möchte von einem Onlinespiel Spieler auslesen. Dabei bekomme ich immer 3-12 Spieler, inklusive deren Attribute / Preisen per ResponseStream zurück.

    Jetzt muss ich natürlich diesen langen Quelltext in die jeweiligen Formen "zuschneiden", damit ich die Informationen für jeden einzelnen Spieler seperat herausgeschnitten habe.

    Leider gibt es zwei verschiedene Möglichkeiten, in welcher Reihenfolge die Daten zu mir zurück kommen.

    Die erste Möglichkeit, die ich erfolgreich auslesen kann mit

    VB.NET-Quellcode

    1. Dim regex As New Regex("itemData.*?sellerId")
    sieht so aus:


    Gibt es eine Möglichkeit diese zu kombinieren oder ein Pattern zu erstellen, der beide Möglichkeiten abdeckt?

    Viele Dank und ich hoffe, dass es irgendwie eine Lösung gibt.
    Sven

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

    Ja genau das ist JSON. Danke für den Link, mal gucken was ich damit anfangen kann :)

    // edit
    Ich habe das Ganze mal grob überflogen und mir ist jetzt nicht ganz klar, was es mir für Vorteile bringt. Ich mein, ich muss ja trotzdem irgendwie die einzelnen Spieler herausfiltern.
    Man bekommt zwar die einzelnen Werte wohl geordnet zurück, aber das könnte ich im Prinzip jetzt ja auch schon machen.

    Woher soll man zum Beispiel Wissen, wann ein neuer Spieler beginnt? Wenn alle Variablen gefüllt sind oder was? :/

    Edit by hal2000:
    - Unnötiges Vollzitat entfernt.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „hal2000“ ()

    Du könntest dir eine Klasse bauen und diese von JSON deserialisieren lassen.

    Oder du erstellst einfach eine Klasse mit genau den Werten die du brauchst und liest diese aus.

    z.B.:

    VB.NET-Quellcode

    1. Private ObjList As New Dictionary(Of String, MyObject) ' hier werden die objekte hineingeschrieben
    2. Sub GetObjects()
    3. Dim s As New IO.StreamReader("C:\Documents and Settings\user\Desktop\testfile.txt", System.Text.Encoding.Default)
    4. Dim o As Json.Linq.JObject = DirectCast(Json.JsonConvert.DeserializeObject(s.ReadToEnd), Json.Linq.JObject)
    5. Dim tok As Json.Linq.JToken
    6. For Each c As Json.Linq.JProperty In o.Children.ToList
    7. If c.Name = "auctionInfo" Then
    8. For Each inner As Json.Linq.JObject In c.Children.ToList()(0).Children
    9. tok = inner.GetValue("itemData")
    10. 'Hier werden die entsprechenden Token ausgelesen. In diesem Fall die ID under der itemType
    11. ObjList.Add(tok.Value(Of String)("id"), New MyObject With {.ID = tok.Value(Of String)("id"), .ItemType = tok.Value(Of String)("itemType")})
    12. Next
    13. End If
    14. Next
    15. debugger.break
    16. End Sub
    17. 'Das ist die Klasse
    18. Public Class MyObject
    19. Public Property ID As String
    20. Public Property ItemType As String
    21. End Class


    Edit: Ach ja, das ist natürlich nur ein Beispiel-Aufruf. Da ich die JSON-Lib nicht so ausführlich kenne, kann es sein dass es hier bessere Methoden gibt...
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

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

    Du bist sowas von genial! Wie kann man auf sowas kommen ... Das ist genau die Lösung für mein Problem.
    Hast du schon öfters mit JSON-Konvertierungen gearbeitet? Weil die Idee den Json-String in eine txt-Datei zu schreiben ist echt gut. Ich habe die ganze Zeit überlegt, wie man das Problem mit den Anführungszeichen in dem String löst.

    Also am besten gleich in eine Textdatei schreiben oder?

    Vielen vielen Dank schonmal!

    Edit by hal2000:
    - Unnötiges Vollzitat entfernt.

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

    Hab JSON zum ersten mal benutzt. Ist aber ziemlich ordentlich strukturiert.

    JSON ist, soweit ich weiß, eine Methode zum Serialisieren von Daten.

    Von wo bekommst du denn den String? Falls dieser von einem Webserver stammt, kannst du diesen direkt übergeben.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Ja genau, ich bekomme ihn über:

    VB.NET-Quellcode

    1. Dim postresponse As HttpWebResponse = postreq.GetResponse()
    2. Dim postreqreader As New StreamReader(postresponse.GetResponseStream())
    3. Dim JSONText As String = postreqreader.ReadToEnd
    4. Return JSONText


    Dann einfach den JSONText direkt in den StreamReader übergeben oder?

    Echt klasse, dass einem hier so gut geholfen wird.
    Einfach statt

    VB.NET-Quellcode

    1. Private ObjList As New Dictionary(Of String, MyObject) ' hier werden die objekte hineingeschrieben
    2. Sub GetObjects()
    3. Dim s As New IO.StreamReader("C:\Documents and Settings\user\Desktop\testfile.txt", System.Text.Encoding.Default)
    4. Dim o As Json.Linq.JObject = DirectCast(Json.JsonConvert.DeserializeObject(s.ReadToEnd), Json.Linq.JObject)
    5. '....


    Folgendes verwenden:

    VB.NET-Quellcode

    1. Private ObjList As New Dictionary(Of String, MyObject) ' hier werden die objekte hineingeschrieben
    2. Public Function GetJSONString() as String 'Falls deine Funktion so heißt... Wenn nicht, einfach dementsprechend unten ändern
    3. Dim postresponse As HttpWebResponse = postreq.GetResponse()
    4. Dim postreqreader As New StreamReader(postresponse.GetResponseStream())
    5. Dim JSONText As String = postreqreader.ReadToEnd
    6. Return JSONText
    7. End Function
    8. Sub GetObjects()
    9. Dim o As Json.Linq.JObject = DirectCast(Json.JsonConvert.DeserializeObject(GetJSONString), Json.Linq.JObject)
    10. '....
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Das Ganze mit RegEx abzubilden wäre schlichtweg zu kompliziert, denn man müsste für jeden Wert einen eigenen RegEx-Ausdruck anlegen.
    Und wenn es schon so eine gute LIB gibt, dann ist man mit dieser am besten aufgehoben.

    Zuerst mal Anforderungen abklären. Wenn man weiß, was man vor sich hat (JSON, XML, YAML usw.), dann kann man dafür gezielt eine Lösung suchen.

    RegEx ist der letzte Ausweg, wenn sonst nichts (bzw. nur sehr kompliziert) geht oder wenn man nur ein Pattern hat, das geprüft oder gesucht werden soll. (URL, Telefonnummer, e-mail Addresse usw.)
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D