Problem mit Regex Groups... Beim Einzelschritt geht's!

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Renati.

    Problem mit Regex Groups... Beim Einzelschritt geht's!

    Hallo an Alle.
    Ich habe mir mehrere Regex geschrieben, welche mir über Regex.Groups aus einem HTML Response bestimmte Daten liefern sollen.
    So weit so Gut. Beim Testen Funktioniert alles, wenn ich mein Programm in Einzel- oder Prozedur-Schritten durchlaufe, erhalte ich mein gewünschtes Ergebnis. Habe ich aber keinen Stoppunkt gesetzt, verhält sich mein Programm wie "Lotto", nur mit besseren Chancen. Ich würde sagen, 1 von 4 mal bekomme Ich ein Ergebnis. Folgend mal die Funktion:

    VB.NET-Quellcode

    1. Private Function GetWatchID(ByVal mySearchString As String) As String Dim myWatchIDEx As New Regex("video_id=(?[\w]+)\&plid") Dim myWatchID As String = myWatchIDEx.Match(mySearchString).Groups("WatchID").Value
    2. Return myWatchID
    3. End Function
    4. Private Function GetTID(ByVal mySearchString As String) As String
    5. Dim myTIDEx As New Regex("""t"": ""(?[\w]+)=") Return myTIDEx.Match(mySearchString).Groups("TID").Value
    6. End Function


    Als Parameter "mySearchString" könnt ihr YouTube HTML-Quellcode von Videos nehmen.
    Ich habe einfach nicht im geringsten eine Ahnung, Woran und vor allem WARUM sich das Programm so verhält, und wäre für jeden Vorschlag dankbar. Könnte es ja auch über diverse InStr und SubString Agfragen machen, aber ich glaube, dass Regex wohl performanter und schneller ist, oder irre Ich mich da?
    sowas wie

    VB.NET-Quellcode

    1. Private Function GetTID(ByVal mySearchString As String) As String
    2. Dim Anfang As Integer
    3. Dim Ende As Integer
    4. Dim Länge As Integer
    5. Dim Name As Integer
    6. Anfang=InStr(mySearchString, """t"": "")+6 Ende=InStr(Anfang, mySearchString, "=")Länge = Ende-Anfang Name= Mid(mySearchString, Anfang, Länge)Return Name End Function


    sollte doch Länger dauern.
    Hat jemand irgend eine Idee?
    HMMM,
    keine Einzige Antwort??
    Woran liegt es? War ich zu ungenau? Soll ich noch irgendwas Hochladen? Habe es nun So "Gelöst", die "Lösung" finde ich aber sehr schlecht.


    VB.NET-Quellcode

    1. Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
    2. If txtLink.Text.Contains("youtube") Then
    3. Dim Info As New YouTubeInfo(txtLink.Text)
    4. Dim myreturn
    5. Do While Info.Watch_ID.Length = 0
    6. myreturn = MessageBox.Show("Leider hat das Auslesen nicht geklappt", "Unbekannter Fehler", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error)
    7. If myreturn = 4 Then
    8. Info = New YouTubeInfo(txtLink.Text)
    9. Else
    10. Exit Sub
    11. End If
    12. Loop
    13. FillDataRow(Info)
    14. End If
    15. End Sub


    Der Konstruktor New YoutubeInfo holt sich erst den String und Übergibt ihn an GetWatchID und GetTID
    hat jemand bessere Ideen?
    Naja, in dieser Variante (Programm funktioniert nur mit schrittweisem Debuggen) funktioniert es meist deshalb, weil durch die Einzelschritte bzw. Haltepunkte (aus Sicht des Rechners) ewig lange Pausen zwischen den Methodenaufrufen liegen. Dann sind z.B. Daten berechnet, die sonst nicht immer schon vorliegen. Daraufhin müsstest du das mal untersuchen.
    Die umgekehrte Variante (Programm funktioniert nur ohne Debuggen) ist hingegen meist nur ein Problem mit dem angehängten Debugger, das aber nur nebenbei. ^^
    Wie Soll ich das den Rausfinden? Soll ich versuchen mein Programm absichtlich zu verlangsamen?
    Hatte schon selbst daran gedacht, dass ihm

    VB.NET-Quellcode

    1. Private Function GetTID(ByVal mySearchString As String) As String
    2. Dim myTIDEx As New Regex("""t"": ""(?[\w]+)=")
    3. Return myTIDEx.Match(mySearchString).Groups("TID").Value
    4. End Function

    zu schnell iss und hatte deshalb ja

    VB.NET-Quellcode

    1. Private Function GetTID(ByVal mySearchString As String) As String
    2. Dim myTIDEx As New Regex("""t"": ""(?[\w]+)=")
    3. Dim myreturn = myTIDEx.Match(mySearchString).Groups("TID").Value
    4. Return myreturn
    5. End Function

    die Variable myreturn Eingebaut. Ich meine, was kann ihm in Dieser kleinen Funktion dann noch nicht Vorliegen? "mySearchString" wird übergeben, und myreturn ist festgelegt...
    die Function

    VB.NET-Quellcode

    1. Private Function GetTID(ByVal mySearchString As String) As String
    2. Dim myTIDEx As New Regex("""t"": ""(?[\w]+)=")
    3. Dim myreturn = As String
    4. myreturn = myTIDEx.Match(mySearchString).Groups("TID").Value
    5. Return myreturn
    6. End Function


    macht die Quote Subjektiv auch nicht besser. Und ein Thread.sleep möchte Ich nun Wirklich nicht einbauen.
    danke schonmal für die Antworten im Vorraus
    Solche Fehler findet man auch meist durch anfängliches Probieren.
    Zum Testen solltest du tatsächlich mal längere Sleeps hinter jede Anweisung packen. Damit kannst du herausfinden, ob es tatsächlich einen anderen Prozess gibt, der erst gescheduled werden muss.