RegEx dauert lange

  • VB.NET

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    RegEx dauert lange

    Moin,

    ich habe ein Problem mit RegEx. Das Pattern gibt mir die Werte alle richtig aus, aber zwischendurch dauert der Vorgang lange (80s sagt die StopWatch-Klasse ^^).
    Mein Pattern:

    Quellcode

    1. </table>.*?<div id=".*?">(.*?)</div>.*?<div class="asqFooter">


    Edit: Pattern gelöst, neues Problem hier.



    Mfg.
    SAR

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SAR-71“ ()

    @Kangaroo: Darf ich euch also nicht mitteilen, dass ich ein Problem habe? :D

    VB.NET-Quellcode

    1. reg = System.Text.RegularExpressions.Regex.Matches(WebText, "</table>.*?<div id="".*?"">(.*)</div>.*<div class=""asqFooter"">")
    2. For Each match In reg
    3. Text = (match.Groups(1).Value)
    4. Next

    Denke aber nicht, dass es daran liegt. Sämtliche Online-Tester stürzen dort sofort ab. Und es muss an den .*? liegen, sobald ich die rausnehme stürzen Online-Tester nicht mehr ab.

    @Rinecamo: Es sind Webseiten (von eBay) und jeweils bis zu 100kB groß. Andere Pattern haben damit jedoch keine Probleme.


    Mfg.
    SAR
    Das ist das Problem von eBay. Es gibt zig verschiedene Darstellungsmethoden. (Die scheinbar zufällig sind)
    Link ist nicht mehr vorhanden.

    Er findet also nichts und trotzdem muss ich 80s warten bis er mit dem Pattern durch ist.


    Mfg.
    SAR

    SAR-71 schrieb:

    Darf ich euch also nicht mitteilen, dass ich ein Problem habe? :D

    Nein.

    SAR-71 schrieb:

    Das ist das Problem von eBay. Es gibt zig verschiedene Darstellungsmethoden.

    Dann setz auf der offiziellen eBay-API auf, dafür ist die da.

    @Samus Regex ist aber schnell, zumindest für die 108kB sollte selbst Sars's Pattern kein Problem sein.

    Also liegts vermutlich doch an dem drumherum, ( oder Du liest mit der Stopwatch nicht nur die Lesezeit 1 Seite). Also mal genauer ran.

    Zur Not kannst Du noch die Regex-Options Compiled auf True setzen.
    Glaubst du mir immer noch nicht? :D

    VB.NET-Quellcode

    1. sw.Start()
    2. If Text = String.Empty Then
    3. reg = System.Text.RegularExpressions.Regex.Matches(WebText, "</table>.*?<div id="".*?"">(.*)</div>.*<div class=""asqFooter"">")
    4. For Each match In reg
    5. Text = (match.Groups(1).Value)
    6. Next
    7. End If
    8. Debug.WriteLine("Third Regex - " & sw.ElapsedMilliseconds)
    9. sw.Stop()


    Werd mir mal die API ansehen.


    Mfg.
    SAR

    SAR-71 schrieb:

    Glaubst du mir immer noch nicht? :D

    So langsam schon.

    Also dann das Pattern: ohne Beispiel ist das kaum nachzuprüfen, aber mich wundert es schon dass die Werte , wie Du sagst, richtig ermittelt werden.

    Dieser Teil hier z.B. >(.*)< ist 'greedy' statt 'lazy': er sucht also soweit wie er kann nach dem letzen '</div>' in der Datei und nicht nach dem nächsten Match.

    Müsste Dir aber in Deinen Ergebnissen aufgefallen sein.

    Weiterhin hast Du anscheinend alle Zeilenvorschübe rausgenommen, das .*? stoppt also erst am Ende des Textes.
    Du hast dir das Pattern noch nicht ganz angesehen, am Ende steht noch: "<div class=""asqFooter"">"
    Der asqFooter ist (wenn er mal vorhanden ist) einmalig. Das es da kein ? ist so gewollt (zwischen "</div>.*<div class=""asqFooter"">" ist der schließlich auch) da ich alle weiteren div-Container erfassen will.

    Die API hab ich mir jetzt doch geschenkt. Ich will diesen RegEx schaffen. ^^
    Mein neues Pattern sieht so aus:

    Quellcode

    1. <div (class="(ngvi_)*item_description"|id="(ngvi_)*desc_div")>(.*?)<div class="(vi-qa-main_qa|asqFooter)">


    Alle Online-Tester haben kein Problem damit, nur mein Programm findet gar nichts.

    VB.NET-Quellcode

    1. reg = System.Text.RegularExpressions.Regex.Matches(WebText, "<div (class=""(ngvi_)*item_description""|id=""(ngvi_)*desc_div"")>(.*?)<div class=""(vi-qa-main_qa|asqFooter)"">")
    2. For Each match In reg
    3. Text = (match.Groups(4).Value)
    4. Next



    Er sagt mir jedes Mal, dass es kein Match gibt (also überhaupt keins). Wenn ich aber den Input auf irgendwelche Online-Tester kopiere, landet das Gewünschte in Gruppe 4.
    Die Compiled-Eigenschaft habe ich wieder rausgenommen. Wenn er lange braucht, hilft er deutlich (von 80 auf 30s), bei dem neuen Pattern braucht er viel zu viel Zeit mit dem Compiled (1s oder so).



    Mfg.
    SAR

    SAR-71 schrieb:

    Du hast dir das Pattern noch nicht ganz angesehen, am Ende steht noch: "<div class=""asqFooter"">"
    Der asqFooter ist (wenn er mal vorhanden ist) einmalig.

    Ich hab mir das Pattern länger angesehen als es wert ist.

    Egal ob dort der Footer steht und ob er einmalig ist, Regex macht in dieser Form folgendes:
    1. such das Zeug bis zum greedy .*
    2. suche dann bis zum allerletztenn(!) '</div>' in dem ganzen Text
    3. schau nach ob ich danach noch den Rest finde
    4. nicht gefunden: suche das vorletzte '</div> in der ganzen Datei und mache bei 2. weiter etc etc.

    Das 'greedy' Pattern ist Teufelswerk, kapiert ?
    Zugegeben, es ist nicht gut, aber irgendwie muss ich ja alle Container bis auf das Letzte vor dem Footer mitnehmen.

    Edit:

    Quellcode

    1. <div (class="(ngvi_)*item_description"|id="(ngvi_)*desc_div")>(.*?)<div class="(vi-qa-main_qa|asqFooter)">

    Das ist fast das perfekte Pattern, jedoch hat .NET irgendwas dagegen. Und ich habe keine Ahnung was.

    Edit²: Selbst wenn ich das auf Folgendes runterbreche, PHP-RegEx findet es, .NET-RegEx aber nicht.

    Quellcode

    1. <div id="ngvi_desc_div">(.*?)<div class="vi-qa-main_qa">

    Selbst wenn ich alle möglichen Zeichen escape -> In .NET wird nichts gefunden.


    Mfg.
    SAR

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „SAR-71“ ()

    Beispiel-Input (Der selbe, von Beitrag #6):
    DOWNLOAD

    Dazugehöriger (gewollter) Output:

    Quellcode

    1. <div id="ngvi_desc_div" class="d-pad"><div><div>&nbsp;Produktbeschreibung:<br>Gewicht:652 g, (....) <div></div></div></td></tr></table><div><div>


    Pattern der (unter PHP) funktioniert (, aber nicht bei .NET):

    Quellcode

    1. <div (class="(ngvi_)*item_description"|id="(ngvi_)*desc_div")>(.*?)<div class="(vi-qa-main_qa|asqFooter)">


    Gut zu Testen unter www.myregextester.com
    Beachte Hacken bei "USE .NET".



    Mfg.
    SAR
    Dateien
    • 123.zip

      (22,34 kB, 154 mal heruntergeladen, zuletzt: )
    Bei mir findet er was (mit dem Pattern aus Post#19):
    Spoiler anzeigen

    Quellcode

    1. <div class="item_description"><div id="ngvi_desc_div" class="d-pad"><div><div>&nbsp;Produktbeschreibung:<br>Gewicht:652 g, Breite:18.57 cm, Tiefe:0.94 cm, H�he:24.12 cm, Laufzeitdetails:Web-Browsing �ber Wi-Fi - bis zu 10 Stunde(n) Video-Wiedergabe - bis zu 10 Stunde(n) Audio-Wiedergabe - bis zu 10 Stunde(n), Kapazit�t:42.5 Wh, Technologie:Lithium-Polymer, Betriebszeit:Bis zu 10 Stunden, Typ:24.6 cm ( 9.7" ) IPS TFT - LED-Hintergrundbeleuchtung, Aufl�sung:2048 x 1536 ( 264 ppi ), Merkmale:Fingerabdruckabweisende, �labweisende Beschichtung, Retina-Display, Touchscreen:Multi-Touch, Bildformate:GIF, JPEG, TIFF, PPT, PPTX, Unterst�tzte Textformate:DOCX, PDF, TXT, RTF, DOC, HTML, Schnittstellen:1 x Kopfh�rer 1 x Lightning, Details zu Service &amp; Support:Begrenzte Garantie - 1 Jahr Technischer Support - Telefonberatung - 90 Tage, Nach hinten gerichtete Kamera:5 Megapixel, Funktionen:Videostabilisator, Tap To Focus, Foto- und Video-Geotagging, Gesichtserkennung in Standbildern, 5-Megapixel-iSig
    2. ht-Kamera, Autofokus, FaceTime-HD-Kamera, Nach vorn gerichtete Kamera:1,2 Megapixel, HD-Videoaufnahme:1080p, Wireless Connectivity:802.11 a/b/g/n, Bluetooth 4.0, Audio:Mikrofon , Lautsprecher, Unterst�tzte digitale Audio-Formate:MP3, WAV, AAC, AIFF, gesch�tztes AAC, Audible, Apple Lossless, Unterst�tzte Digitalvideoformate:MPEG-4 SP (bis zu 640x480), Motion JPEG (bis zu 1.280 x 720), H.264 High Profile Level 4.1 (bis zu 1080p), Anz. der Kerne:Dual-Core, Prozessor:Apple A6X, Vorinstallierte Software:Clock, Mail, Notes, Calendar, Contacts, Messages, Camera, FaceTime, Photo Booth, Safari, Videos, Photos, App Store, Maps, Game Center, iBooks, iTunes, Newsstand, Siri, iCloud, Reminders, Music, Speicherkapazit�t:16 GB, Erforderliches Betriebssystem:Microsoft Windows XP Professional SP2, Microsoft Windows XP Home Edition SP2, Microsoft Windows 7, Microsoft Windows Vista, Apple MacOS X 10.6.8 od<br><br>Allgemeines:<br><div class="tsTable"> <div class="tsRow"><span class="tsLabel">Marke</span><span>
    3. Apple</span></div> <div class="tsRow"><span class="tsLabel">Produkth�he</span><span>24.1 cm</span></div> <div class="tsRow"><span class="tsLabel">Produktbreite</span><span>18.6 cm</span></div> <div class="tsRow"><span class="tsLabel">Bildschirm Gr��e</span><span>9.7 Zoll</span></div> </div> <div class="tsSectionHeader">Prozessor</div> <div class="tsTable"> <div class="tsRow"><span class="tsLabel">Prozessoranzahl</span><span>2<br><br>Der Artikel ist so gut wie neu.<br>R�ckgabe ist nicht m�glich.<br><br>Viel Spa� beim bieten ;-)<br></span></div> </div><br><p /><hr/><span class="ebay">Am 08.01.13 hat der Verk�ufer die folgenden Angaben hinzugef�gt:</span><p /><P><font face="Arial" size="2">Es handelt sich um ein neues iPad 4 + G4 + 16GB mit OVP (Originalverpackung)</font><div><font face="Arial" size="2">Zu dem Artikel wird dazu eine passende Tasche gegeben.</font></div><div><font face="Arial" size="2">Das iPad ist schwarz.</font></div><div><font face="Arial" size="2
    4. ">Alle Kabel sind dabei.</font></div><div><font face="Arial" size="2"><br></font></div></P></div></div></div></div></div></td></tr></table><div><div><div class="vi-qa-main_qa">

    " beim pattern logischerweise durch "" ersetzen. Also:

    VB.NET-Quellcode

    1. "<div (class=""(ngvi_)*item_description""|id=""(ngvi_)*desc_div"")>(.*?)<div class=""(vi-qa-main_qa|asqFooter)"">"