StringRegExp mit Hexadezimalzahlen

  • Moin!

    Ich wer hier noch bescheuert ;)

    Folgendes Problem:
    Ich habe eine Datei in der sich Hexadezimalzahlenpaare befinden, die ich gerne parsen möchte. Dieser Text ändert sich natürlich

    Beispiel-Ausschnitt:

    Zitat

    blablubb Value1 5F 6C DE F4 blablubb blablubb Value2 62 7D 3E 4F blablubb blablubb

    Alle Hexadezimalzahlenpaare sollen erfasst werden inklusive dem ValueX davor.

    [autoit]


    $String = "blablubb Value1 5F 6C DE F4 blablubb blablubb Value2 62 7D 3E 4F blablubb blablubb"
    $Ergebnis = StringRegExplace($String, "Value\d [0-9A-F]{2}", 3)

    [/autoit]

    Bis hierhin funktioniert das bestens. Ergebnisse im Array sind "Value1 5F" und "Value2 62".

    Jetzt habe ich gedacht, dass man das ganze nur 4 Mal wiederholen muss und gut ist:

    [autoit]


    $String = "blablubb Value1 5F 6C DE F4 blablubb blablubb Value2 62 7D 3E 4F blablubb blablubb"
    $Ergebnis = StringRegExplace($String, "Value\d ([0-9A-F]{2} ){4}", 3)

    [/autoit]

    Aber Pustekuchen! Nix is. Wo liegt mein Denkfehler?

    Grüße,
    Buffo

    Einmal editiert, zuletzt von Buffo (29. November 2007 um 10:55)

    • Offizieller Beitrag

    Ich weiß nicht, ob man das noch kürzer hinkriegt, aber funktionieren tut es so:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    $String = "blablubb Value1 5F 6C DE F4 blablubb blablubb Value2 62 7D 3E 4F blablubb blablubb"
    $Ergebnis = StringRegExp($String, "Value\d [0-9A-F]{2} [0-9A-F]{2} [0-9A-F]{2} [0-9A-F]{2}", 3)
    _ArrayDisplay($Ergebnis)

    [/autoit]
  • Jep, so funktioniert es. Genauso behelfe ich mir zur Zeit ;)

    Ich möchte aber wissen, warum mein StringRegExp()-Konstrukt nicht funktioniert und flexibel bleiben. Wenn es mal nicht vier, sondern 12 oder gar 32 Zahlenpaare sind, sollte man es schnell anpassen können.

    Danke für dein Feedback, aber ich suche DIE Lösung oder wenigstens eine Erklärung, warum meine Variante nicht funktioniert :D

    Grüße,
    Buffo

    • Offizieller Beitrag

    Warum Deine Variante nicht funktioniert kann ich Dir auch nicht sagen. Für mich sieht sie logisch aus, aber mit RegExp stehe ich auch auf dem Kriegsfuß. Meistens probiere ich an verschiedenen Möglichkeiten herum, bis dabei etwas rauskommt, was funktioniert.
    Beim rumprobieren habe ich jetzt eine Lösung für Dein Problem gefunden:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    $String = "blablubb Value1 5F 6C DE F4 blablubb blablubb Value2 62 7D 3E 4F blablubb blablubb Value3 12 65 33 1E blablubb blablubbValue4 05 35 37 4E blablubb blablubb"
    $Ergebnis = StringRegExp($String, "Value\d [0-9A-F]{2}.{9}", 3)
    MsgBox(0,'',@error)
    _ArrayDisplay($Ergebnis)

    [/autoit]

    Frag mich aber nicht, wie und warum das funktioniert. Das ist durch ausprobieren entstanden. :D

  • Dein RegEx bedeutet folgendes:

    Value\d =Gib Value und eine Zahl mit anschließendem Leerzeichen zurück
    [0-9A-F]{2}=Gib zwei Hexadezimalstellen zurück
    .{9}=Gib 9 Zeichen (egal welche außer NewLine zurück)

    Klar, das das funktioniert. Könnte man genauso gut

    [autoit]

    StringRegExp($sString, "Value\d .{11}", 3)

    [/autoit]


    nehmen.


    Ich habe eigentlich keine Probleme mit StringRegExp, im Gegenteil ich nutze es sehr gerne und häufig.

    Dass es eine Menge an Möglichkeiten gibt, ist mir bewusst, aber ich möchte den Fehler meines Konstrukts verstehen, denn für mich ist es 100% korrekt ;)

    Grüße,
    Buffo

    • Offizieller Beitrag

    Ahh, so langsam verstehe ich. Habe mir grad noch die Wikipedia-Seite durchgelesen.
    Ich glaube, Dein Fehler liegt in der Leerstelle zwischen den Hexwerten.

    Wenn man das erweitert zu:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    $String = "blablubb Value1 5F 6C DE F4 blablubb blablubb Value2 62 7D 3E 4F blablubb blablubb Value3 12 65 33 1E blablubb blablubbValue4 05 35 37 4E "
    $Ergebnis = StringRegExp($String, "(Value\d([ ][0-9A-F]{2}){4})", 3)
    MsgBox(0,'',@error)
    _ArrayDisplay($Ergebnis)

    [/autoit]

    Dann gibt er das richtig zurück. Allerdings zusätzlich (jeden zweiten Array-Eintrag) den letzten Wert der Hex-Werte:

    Value1 5F 6C DE F4
    F4
    Value2 62 7D 3E 4F
    4F
    Value3 12 65 33 1E
    1E
    Value4 05 35 37 4E
    4E

    Gibt's dafür eine Erklärung?

    Edit: Habe die Erklärung gefunden (non-capturing-group).

    Edit2: Hurra! Jetzt habe ich auch endlich [:xdigit:] verstanden (siehe Script unten). :rolleyes:

    Das Script muß also so aussehen:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    $String = "blablubb Value1 5F 6C DE F4 blablubb blablubb Value2 62 7D 3E 4F blablubb blablubb Value3 12 65 33 1E blablubb blablubbValue4 05 35 37 4E "
    $Ergebnis = StringRegExp($String, "(Value\d(?:[ ][[:xdigit:]]{2}){4})", 3)
    MsgBox(0,'',@error)
    _ArrayDisplay($Ergebnis)

    [/autoit]
  • Oscar : Vielen Dank für deine unermüdliche Unterstützung :)

    Durch dein Script bin ich auf den Fehler gestossen. Weißt du, was der einzige Fehler an meinem RegEx war? Nur das Klammernpaar außenherum hat gefehlt. Manchmal sieht man den Wald vor lauter Bäumen nicht ;)

    Besten Dank noch Mal :)

    Jetzt hast du auch durch deine Hilfe gleich noch RegEx-Ausdrücke gelernt ;)

    Grüße,
    Buffo