Hilfe bei Regulären Ausdruck mit Option Right to left

  • Hallo zusammen folgendes Problem. Eigentlich kein AutoIt spezifisches. Vielleicht kann mir trotzdem jemand helfen.

    Ich habe Text String mit folgenden Inhalt.

    Spoiler anzeigen


    Z:\APP-12000-12999\APP-12633N\APP-12633N-DE\1 Amt
    Z:\APP-12000-12999\APP-12633N\APP-12633N-DE
    Z:\APP-12000-12999\APP-12633N\APP-12633N-DE\2 Filing
    Z:\APP-12000-12999\APP-12633N\APP-12633N-US\6 scanned
    Z:\APP-12000-12999\APP-12633N\APP-12633N-WO\Mandant
    Z:\APP-12000-12999\APP-12633N\APP-12633N-IT\
    Z:\APP-12000-12999\APP-12640P-US01\5 IDS
    Z:\APP-12000-12999\APP-12633N\APP-12633N-TW\
    Z:\APP-12000-12999\APP-12641P-CN\1 agent
    Z:\APP-12000-12999\APP-12641P-CN\2 client
    Z:\APP-12000-12999\APP-12641P-CN\3 scanned documents
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\1 Filing of Application\Amt Filed Version
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\1 Filing of Application\Intern, Dritte
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\1 Filing of Application\Mandant
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\2 Grant Proceedings\Amt
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\2 Grant Proceedings\Intern, Dritte
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\2 Grant Proceedings\Mandant
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\3 Scanned Documents
    Z:\APP-12000-12999\APP-12641P-EP Verdampferrohr\4 Docs received from client
    Z:\APP-18000-18999\APP-18965M-CN1-37
    Z:\APP-18000-18999\APP-18965M-CN1-37\1 agent
    Z:\APP-18000-18999\APP-18965M-CN1-37\2 client
    Z:\APP-18000-18999\APP-18965M-CN1-37\3 scanned docs
    Z:\APP-18000-18999\APP-18965M-CN1-37\4 docs received from agent
    Z:\APP-18000-18999\APP-18965M-CN1-37\5 docs received from client
    Z:\APP-18000-18999\APP-18965M-CN1-42
    Z:\APP-18000-18999\APP-18965M-CN1-42\1 agent
    Z:\APP-18000-18999\APP-18965M-CN1-42\2 client
    Z:\APP-18000-18999\APP-18965M-CN1-42\3 scanned docs
    Z:\APP-18000-18999\APP-18965M-CN1-42\4 docs received from agent
    Z:\APP-18000-18999\APP-18965M-CN1-42\5 docs received from client
    Z:\APP-18000-18999\APP-18965M-CN1-7
    Z:\APP-18000-18999\APP-18965M-CN1-7\1 agent
    Z:\APP-18000-18999\APP-18965M-CN1-7\4 docs received from agent
    Z:\APP-18000-18999\APP-18965M-CN1-7\5 docs received from client
    Z:\APP-18000-18999\APP-18965M-CN2-37\2 client
    Z:\APP-18000-18999\APP-18965M-CN2-37\4 docs received from agent
    Z:\APP-18000-18999\APP-18965M-CN2-42\2 client
    Z:\APP-18000-18999\APP-18965M-CN2-42\4 docs received from agent
    Z:\APP-18000-18999\APP-18965M-CN2-7\1 agent
    Z:\APP-18000-18999\APP-18965M-CN2-7\2 client
    Z:\APP-18000-18999\APP-18965M-CN2-7\3 scanned docs
    Z:\APP-18000-18999\APP-18965M-CN2-7\4 docs received from agent
    Z:\APP-19000-19999\APP-19905P-US\071835US\017835 US_SBG_SOLAR-C_AG_ Non Provisional Application Filed 2-8-2013\__recip_version1.0_#00000002
    Z:\APP-12000-12999\APP-12641P-IN\1 agent
    Z:\APP-15000-15999\APP-15157P-US\3 Scanned Documents
    Z:\APP-16000-16999\APP-16392N-CN\2 client
    Z:\APP-16000-16999\APP-16392N-CN\3 scanned docs
    Z:\APP-16000-16999\APP-16392N-CN\intern dritte
    Z:\APP-16000-16999\APP-16392N-JP\1 agent
    Z:\APP-16000-16999\APP-16392N-JP\2 client
    Z:\APP-16000-16999\APP-16392N-JP\3 scanned docs
    Z:\APP-17000-17999\APP-17595P-EP\1 Filing of Application\Amt Filed Version
    Z:\APP-17000-17999\APP-17595P-EP\1 Filing of Application\Intern, Dritte
    Z:\APP-18000-18999\APP-18965M-CN1-37\4 docs received from agent
    Z:\APP-18000-18999\APP-18965M-CN1-37\5 docs received from client
    Z:\APP-18000-18999\APP-18965M-CN1-42
    Z:\APP-18000-18999\APP-18965M-CN1-42\1 agent
    Z:\APP-18000-18999\APP-18965M-CN1-42\2 client
    Z:\APP-18000-18999\APP-18965M-CN1-42\3 scanned docs
    Z:\APP-18000-18999\APP-18965M-CN1-42\4 docs received from agent
    Z:\APP-18000-18999\APP-18965M-CN1-42\5 docs received from client
    Z:\APP-18000-18999\APP-18965M-CN1-7
    Z:\APP-18000-18999\APP-18965M-CN1-7\1 agent
    Z:\APP-18000-18999\APP-18965M-CN1-7\4 docs received from agent
    Z:\APP-19000-19999\APP-19905P-US\071835US\017835 US_SBG_SOLAR-C_AG_ Non Provisional Application Filed 2-8-2013\__recip_version1.0_#00000002
    Z:\APP-19000-19999\APP-19905P-US\071835US\017835 US_SBG_SOLAR-C_AG_ Non Provisional Application Filed 2-8-2013\__recip_version1.0_#00000003
    Z:\APP-19000-19999\APP-19905P-US\071835US\017835 US_SBG_SOLAR-C_AG_ Non Provisional Application Filed 2-8-2013\__recip_version1.0_#00000004
    Z:\APP-19000-19999\APP-19905P-US\3 Scanned Documents
    Z:\APP-19000-19999\APP-19905P-WO\071835PCTP
    Z:\APP-19000-19999\APP-19907G
    Z:\APP-19000-19999\APP-19907G\4 Docs received from client
    Z:\APP-19000-19999\APP-19907P-WO\4 Docs received from client


    Der Regex hit soll bei folgenden Stelle treffen:

    mindestens bei: [Drei Buchstaben]-[5zahlen][ein Buchstabe]
    Allerdings Optional kann der Teil nach dem Buchstaben auch länger sein. Und zwar alles bis zu einem Leerzeichen, Zeilenende oder "\"


    Soweit kein Problem, folgendes Pattern funktioniert bis auf Zeile 1-6:

    [A-Z]{3}-[0-9]{5}[A-Z].*?(?=[\s\\])

    und da ist genau das Problem. In den ersten 6 Beispielen sollen die APP-12633N-DE und nicht die APP-12633N gefunden werden. Wenn in der Zeile aber nur APP-12633N vorhanden wäre, dann soll das gefunden werden.
    Ich habe darauf hin die .Net Funktion right to left zu benutzen, aber dann bekomme ich ganz seltsame Ergebnisse.


    Kann mir jemand einen Tipp geben wie das zu lösen wäre?

    vielen Dank

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    Einmal editiert, zuletzt von franzp (30. September 2015 um 13:22)

    • Offizieller Beitrag

    Geht das?

  • Der Ansatz vom Zeilenende aus zu suchen ist schonmal gut.
    Nur wie umsetzen?
    Dazu nutzen wir das Dollarzeichen als Zeilenendeoperator und sagen, dass der Raum zwischen unserem Match und dem Zeilenende so klein wie möglich sein soll und das in ihm kein weiterer passender Match enthalten sein darf.
    So bekommst du den letzten Match in der Zeile.

    Zumindestens schien das die Vorgabe zu sein welche man aus deinen Ausführungen ableiten kann.
    Nur zur Zeile 7 hast du nichts gesagt. Dort würde sich mit diesem Ansatz ebenfalls das Ergebnis ändern.

    Hier mal in ein Pattern gegossen:

  • Hi und vielen Dank schonmal,

    Sorry Zeile 7 war mein Fehler. Habs korrigiert. War ein LF zu wenig.


    @Xenobiologist bei Dem Pattern "hitet" er mir in Zeile 1-6 auch den Part davor...

    @AspirinJunkie Sorry bei den Pattern erkenn ich gerade nicht mal was zum Pattern gehört... :) Ich in diesem Fall kein AutoIt, sondern C#. Blöderweise verhält sich Regex manchmal unterschiedlich.

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Ich in diesem Fall kein AutoIt

    Warum postest du den Thread dann im Unterforum AutoIt-Hilfe und Unterstützung anstatt im dafür vorgesehenen Andere Programmiersprachen?!?

    Für C# müsste man es wahrscheinlich so abändern (die C#-RegEx-Engine kennt keine Subroutinen):

    Code
    (?mx)                   # Optionen 
    \\(?<ID>                     # Gruppe welche Matching-Pattern für die ID enthält (Name vergeben damit dieses weiter verwendet werden kann)
       [A-Z]{3}-\d{5}[A-Z]       # Anfang der ID (3 Buchstaben-5Zahlen-1Buchstabe)
          (?>-[^\\\s\n\r]*)?     # optionaler Rest (Bindestrich + alles außer Leerzeichen und \)
    )
    (?>.(?![A-Z]{3}-\d{5}[A-Z]))*?$            # Füllmaterial bis zum Zeilenende mit Vorgabe, dass keine weitere ID kommen darf
  • Sorry, ich dachte es gäbe evtl. eine allgemein gültige Lösung, die nicht Programmierspachen abhängig ist.

    vielen Dank da bin ich schon etwas weiter. Mit diesen Pattern:

    (?mx)(?<ID>[A-Z]{3}-\d{5}[A-Z](?>-[^\\\s\n\r]*)?)(?>.(?![A-Z]{3}-\d{5}[A-Z]))*?$


    30-09-_2015_17-10-08.jpg


    Aber der Hit soll vor dem ersten Leerzeichen oder vor \ oder Zeilenende stoppen.

    also so:

    30-09-_2015_17-22-32.jpg


    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Was interessiert dich denn der ganze Match?
    Du musst doch nur die capturing-groups auswerten - dafür sind die doch da.
    In dem Fall ist es ja nur die Gruppe "ID"
    In C# dann also so in der Art glaube ich: Regex.Match(String, @"blabla").Groups["ID"].Value;.

    Einmal editiert, zuletzt von AspirinJunkie (30. September 2015 um 17:47)

  • vielen dank !

    Capturing Groups hatte ich bisher nie verwendet, aber ja das klappt!

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---