Regex hängt sich auf / bleibt stehen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Chaosprogrammierer.

    Regex hängt sich auf / bleibt stehen

    Hallo zusammen,

    ich habe gerade ein kniffliges problem und hoffe mir kann jemand helfen :) Google kann es irgendwie nicht.

    Also ich versuche einen recht langen string (html code) mit regex nach einem trefferschema zu durchsuchen und mir die resultate zurück geben zu lassen. Dabei muss ich mitunter einige schemas durchgehen (for schleife) bis es treffer gibt (max. 5 im moment).

    Soweit funktioniert es auch gut. Das problem was ich habe ist, das sich regex scheinbar wahllos aufhängt.

    Hier erst einmal mein code:

    VB.NET-Quellcode

    1. Dim pattern As String = RankingQueries(I, 5).ToString
    2. Debug.Print(pattern)
    3. ' Instantiate the regular expression object.
    4. Dim r As Regex = New Regex(pattern)
    5. matches = r.Matches(html)
    6. Debug.Print(matches.Count)
    7. If matches.Count < 150 And matches.Count > 0 Then
    8. matchcount = 0
    9. resPosition = 0
    10. 'Do While m.Success
    11. For Each m As Match In matches
    12. matchcount += 1
    13. If InStr(m.Groups(RankingQueries(I, 6).ToString).Value, domain) > 0 Then
    14. 'yes, found it
    15. resPosition = matchcount
    16. Exit For
    17. End If
    18. System.Threading.Thread.Sleep(0)
    19. If MainForm.BackgroundWorker1.CancellationPending = True Then Exit Function
    20. Next
    21. If matchcount > 0 Then Exit For
    22. If MainForm.BackgroundWorker1.CancellationPending = True Then Exit Function
    23. End If
    24. matches = Nothing
    25. If MainForm.BackgroundWorker1.CancellationPending = True Then Exit Function
    26. System.Threading.Thread.Sleep(0)
    27. If resPosition > 0 Then Exit For


    Der pattern bei dem er jetzt gerade hängt ist (aber wie gesagt, scheint sich wahllos bei irgend einem pattern aufzuhängen):

    Quellcode

    1. <li (.*?)><h3 (.*?)><a href="(.*?)" (.*?)>(.*?)</a></h3>(.*?)</li>

    (Kann man das vielleicht noch optimieren? Bin mit regulären ausdrücken nicht so der guru :S Brauche ja nur den link.)

    Das ganze hängt nicht bei "matches = r.Matches(html)", sondern erst in der nächsten zeile, bei "Debug.Print(matches.Count)".
    Wenn ich die ausführung unterbreche dann ist die zeile grün hinterlegt. Bleibe ich mit der maus auf "matches.count" dann kommt die message "error: cannot obtain value".

    Habe auch schon ein abfangen mit "try" versucht. Aber kann ja nicht funktionieren da er richtig bei der zeile hängt und sich nicht mehr rührt. Auch ein beenden des backgroundworkers ist nicht möglich da er nicht die ausführung von "BackgroundWorker1.CancellationPending" erreicht. Der backgroundworker hängt und das wars. ;(


    Mein verdacht ist das dass html vielleicht manchmal nicht valide ist und (z.B.) ein "</li>" fehlt und es deswegen regex entschärft?


    (Das ganze läuft im backgroundworker.)

    Ich hoffe ihr könnt mir dabei helfen.


    Viele Grüße
    Chaosprogrammierer

    Chaosprogrammierer schrieb:

    Das problem was ich habe ist, das sich regex scheinbar wahllos aufhängt.

    Das Problem bei Regex: Bei "beinahe" treffern kann die Performance extrem in die Knie gehen. Irgendwo bei MSDN war mal ein Benchmark, da ging irgendwann die suchzeit extrem hoch (quadratisch zur Länge des "Beinahe"-Matches). Find ich jetzt auf die Schnelle aber leider nicht mehr.

    EDIT: call me google ;)
    msdn.microsoft.com/en-us/library/gg578045.aspx
    Rückverfolgung? Jetzt verstehe ich gar nix mehr :)

    Hab jetzt den obigen pattern wie folgt mal umgeschrieben... und es scheint so nun zu funktionieren.

    Quellcode

    1. <li .*?><h3 .*?><a href=""(.*?)"" .*?>.*?</a>.*?</li>


    Hoffe das ist jetzt nicht totaler mist. Aber es funktioniert und der hänger ist weg. Nur wie gesagt, es tritt sporadisch auf. Wohl wahrscheinlich je nachdem was ich für einen quellcode zurück bekommen.

    Ich werde es mal beobachten.