StringRegExp Problem

  • Servus zusammen,

    ich verzweifel nun schon länger an folgenden StringRegExp.
    Zuvor sei gesagt, dass das Gebiet der Regulären Ausdrücke Neuland bei mir ist. Habt bitte Nachsicht :D

    Vorgabe:

    Code
    <tr>
      <td>Wert1:</td>
      <td>112233&nbsp;%</td></tr>
    <tr>
      <td>Wert2:</td>
      <td>11.223&nbsp;g</td></tr>
    <tr>
      <td>Wert3:</td>
      <td><span>1.975.896</span>&nbsp;&euro;</td></tr>
    <tr>

    Ich hatte gehofft, mit RegExp alle mit einem Einzeiler "parsen" zu können.
    Hier mein RegExp:

    Code
    $Data = StringRegExp($sHTML, '(Wert1:|Wert2:|Wert3:)\s*(\d*)', 3)

    Dieser soll nach Wert1,Wert2 und Wert3 und einem Zeilenumbruch, alle darauffolgenden Zahlen von 0-9 zurück geben.

    Das Ergebnis ist bis dato:

    Code
    Wert1:
    
    
    Wert2:
    
    
    Wert3:

    Ich hoffe Ihr könnt mir weiterhelfen.
    Ziel ist es, alle Zahlenwerte aus der von Wert1,Wert2 und Wert3 darauffolgenden Zeile zu erhalten.

    Vielen Dank schon mal im voraus!

  • Nur weil du auf der Seite das <td> nicht siehst, musst du es trotzdem im StrignRegExp einbeziehen, versuch mal folgende Pattern:

    Code
    "(?i)(?s)<tr>\r\n\s*?<td>Wert\d:</td>\r\n\s*?<td>(?:<span>)?(\d+?\.\d+?).+?(?:</span>)?</td></tr>"

    (Flag 3)

    Einmal editiert, zuletzt von TheShadowAE (20. März 2011 um 19:49)

  • Also zuerst kommt die Fehleranalyse in deinem Pattern.

    Ich habe das mal zur anschaulicheren Darstellung im RegExBuddy gemacht. Links die Ansicht mit dem Teststring und Rechts die Debug-Ansicht.
    autoit.de/wcf/attachment/12912/

    Code
    (Wert1:|Wert2:|Wert3:)\s*(\d*)

    Zuerst suchst du ja nach Wert1, Wert2, oder Wert3

    Code
    (Wert1:|Wert2:|Wert3:)


    Das wird auch gefunden, wie du in Schritt 1-7 sehen kannst.

    Danach suchst du nach 0 oder mehr Whitespaces - damit wolltest du wahrscheinlich den Zeilenumbruch finden.

    Code
    \s*


    Die RegExp Engine findet keine Whitespaces (denn an dieser Stelle folgt zuerstmal ein </td>), und ist damit auch zufrieden. Denn du hast ihr ja mit dem * gesagt, dass 0 Whitespaces in Ordnung sind. Das siehst du in Schritt 8

    Code
    (\d*)


    In Schritt 9 gibt es das ganze nochmal mit den Zahlen, die du gesucht hast. 0 oder mehr Zahlen, und 0 Zahlen findet die RegExp Engine auch hier!

    In Schritt 10 bestätigt die Engine dann, dass das Match abgeschlossen ist - Sie hat dein Pattern stur umgesetzt.


    Das kürzeste Pattern, was auf deinen Quelltextausschnitt passt, wäre dieses hier. Ich bezweifle aber, dass auch bei längeren Quelltexten da noch die Genauigkeit stimmt.

    Code
    Wert[123]:\D+([\d.]+)


    (Sucht zuerst Wert1, -2 oder -3. Danach einen Doppelpunkt. Mit \D+ werden dann 1 oder mehr "Nicht-Zahlen" gefunden - eben alles bis die Zahlen in der nächsten Zeile anfangen. Danach alle Zeichen, die entweder Zahlen oder Punkte sind.)

    Etwas genauer, und leichter erweiterbar wäre allerdings dieses hier:

    Code
    (?:Wert1:|Wert2:|Wert3:).+\s+<td>(?:<span>)?([\d.]+)

    In meiner Signatur findest du übrigens ein Tutorial zu dem Thema