StringRegExp(erten) für Patternerweiterung benötigt

  • Hallo Forum,
    habe gerade viel mit etwas zu tun, was ich am wenigsten kann StringRegExp.
    Mit der Hilfe von Oscar habe ich folgenden Ausdruck gebastelt.

    [autoit]

    $aOut_c = StringRegExp($sData_c, '.+\((.+?),\s*(-*\d+)\);', 3)

    [/autoit]


    hier ein Ausschnitt meines Teststrings

    Code
    s32_error |= ba_llt_writeTempEEPROM(PWM1_MIN, 200);
    s32_error |= ba_llt_writeTempEEPROM(PWM1_MAX, -800);
    s32_error |= ba_llt_writeTempEEPROM(DIOM_1_DIOS_1_PWM1_MAX,  1200);
    s32_error |= ba_llt_writeTempEEPROM(AE10_0,730);


    das Ergebnis in dem Array sieht dann so aus:

    [autoit]

    $aOut_c[0] ;= PWM1_MIN
    $aOut_c[1] ;= 200
    $aOut_c[2] ;= PWM1_MAX
    $aOut_c[3] ;= -800
    $aOut_c[2] ;= DIOM_1_DIOS_1_PWM1_MAX
    ...

    [/autoit]


    Nun muss der SRE-Ausdruck aber erweitert werden, dass auch folgende Strings so eingelesen werden.

    Code
    s32_error |= ba_llt_writeTempEEPROM(DIOM_1_DIOS_3_PREOPERA_OUT,PREOPERA_OUT);
    s32_error |= ba_llt_writeTempEEPROM(PWM2_MIN,GD_GEBER_ANALOG);
    s32_error |= ba_llt_writeTempEEPROM(PWM2_MAX, true);
    s32_error |= ba_llt_writeTempEEPROM(PWM3_MIN,((word) 200);
    s32_error |= ba_llt_writeTempEEPROM(PWM3_MAX,((word)-800);


    zu Zeile 1-4) das letzte Komma trennt die beiden Parameter
    zu Zeile 3) nach dem Komma können keines oder mehrere Leerzeichen stehen, und natürlich auch "false" o.ä
    zu Zeile 4-5) der Datentyp ist nicht wichtig "((word)" oder andere Typen ignorieren, generell alles was keine Zahl ist

    Und das soll herauskommen

    [autoit]

    $aOut_c[0] ;= DIOM_1_DIOS_3_PREOPERA_OUT
    $aOut_c[1] ;= PREOPERA_OUT
    $aOut_c[2] ;= PWM2_MIN
    $aOut_c[3] ;= GD_GEBER_ANALOG
    $aOut_c[4] ;= PWM2_MAX
    $aOut_c[5] ;= true
    $aOut_c[6] ;= PWM3_MIN
    $aOut_c[7] ;= 200
    $aOut_c[6] ;= PWM3_MAX
    $aOut_c[7] ;= -800
    ...

    [/autoit]

    Ich hoffe ich konnts verständlich erklären

    Vielen Dank
    Michael

  • wie wärs damit:

    [autoit]


    $aOut_c = StringRegExp($sData_c, '.+\((.+?),\s*(-*\w*)\);', 3)

    [/autoit]

    hoffe es funktioniert :)

  • Hallo,
    ich kanns grad leider nicht mit autoit testen, aber ein online-regex-tester erkennt die hier noch nicht


    Code
    s32_error |= ba_llt_writeTempEEPROM(GD_WINKEL_POS_LINKS,((word) -900));
    s32_error |= ba_llt_writeTempEEPROM(GD_WINKEL_POS_RECHTS,((word) 900));
    s32_error |= ba_llt_writeTempEEPROM(GD_NULLPOSITION_ANALOG,((word) 1350));

    hier:
    [Blockierte Grafik: http://s3.directupload.net/images/100910/v675qfo9.jpg]

    aber danke für das pattern

    Grüße
    Michael

  • Vielleicht hab ich grad nen Hirnkrampf, aber ich habs jetzt nicht geschafft das mit einem einzelnen RegExp zu lösen, deswegen hier die Lösung mit RegExpReplace vorher:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;~ s32_error |= ba_llt_writeTempEEPROM(DIOM_1_DIOS_3_PREOPERA_OUT,PREOPERA_OUT);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM2_MIN,GD_GEBER_ANALOG);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM2_MAX, true);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM3_MIN,((word) 200);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM3_MAX,((word)-800);

    [/autoit] [autoit][/autoit] [autoit]

    $sText = ClipGet()
    ConsoleWrite($sText & @CRLF)
    $aRet = StringRegExp(StringRegExpReplace($sText, ',\s*\(\([^()]+\)\s*([^()]+)\)', ",$1)"), "\(([^(,]+),\s*([^)]+)", 3)
    _ArrayDisplay($aRet)

    [/autoit]

    Ansonsten hier mit einem einzelnen RegExp - allerdings mit Leerstellen im Array, weil ja für jedes Match immer Gruppe 2 ODER 3 gesucht wird. Und wenn Gruppe 2 (also ohne "(dword)") nicht gefunden wird, hinterlässt soe dieses leere Arrayelement.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;~ s32_error |= ba_llt_writeTempEEPROM(DIOM_1_DIOS_3_PREOPERA_OUT,PREOPERA_OUT);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM2_MIN,GD_GEBER_ANALOG);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM2_MAX, true);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM3_MIN,((word) 200);
    ;~ s32_error |= ba_llt_writeTempEEPROM(PWM3_MAX,((word)-800);

    [/autoit] [autoit][/autoit] [autoit]

    $sText = ClipGet()
    ConsoleWrite($sText & @CRLF)
    $aRet = StringRegExp($sText,"\(([^(,]+),\s*(?:([^()]+)|\(\([^)]+\)\s*([^)]+))\);",3)
    _ArrayDisplay($aRet)

    [/autoit]
  • oh das hatte ich wohl falsch verstanden ;(
    ich dachte ich soll "((word)" ignorieren :rolleyes:

    Zitat

    "((word)" oder andere Typen ignorieren


    das hat es nämlich viel einfacher gemacht 8o

  • Soll das eine Regexp Übung werden?

    Weil das lässt sich doch einfach und schnell(er) mit Stringbetween und stringsplit lösen.

    So aus dem Kopf heraus.

    [autoit]


    $sbetween=_Stringbetween($stext, "(", ")")
    $asplit=Stringsplit($sbetween, ",")
    $ret=Stringreplace($asplit[2], "word", "")

    [/autoit]
  • Möglicherweise:

    [autoit]

    $aRet = StringRegExp($sText,"(?m)^[^(]+\((\w+)\s*,\s*(?:\(\(\w+\))*\s*([-\w]+)\s*\).*$",3)

    [/autoit]
  • Hallo zusammen,

    @SEuBo ich hab deine beiden Pattern mal durchlaufen lassen, und auf den ersten Blick passt glaub alles. Es sind bei dieser Datei aber 5000 Zeilen, die durchgesucht werden, dazu kommt noch, dass es eine zweite datei gibt, die eine Adresse zu diesen Bezeichnungen und Werten beinhaltet und alle Parameter dann zu einer einzigen (momentan html) zusammengefasst werden. Der Oscar hat mir hierbei schon wahnsinnig geholfen, denn es gibt keinen einheitlichen Aufbau. Danke nochmals Oscar.
    Ich werde mir die Ergebnisse übers WE mal anschauen. Es gibt bestimmt noch einen Sonderfall. Darf ich mich nochmal an dich wenden, falls das Pattern noch ne kleine Änderung braucht?

    @nuts Stringbetween und Stringsplit sind hier einfach nicht flexibel genug, wie gesagt es handelt sich um hunderte Dateien mit jeweils ca. 5000 Parametern, die ich alle auslesen und zu einer html-tabelle zusammenfassen muss.


    EDIT:
    Hier ist ein kleines Ausschnitt, damit ihr euch was drunter vorstellen könnt.
    [Blockierte Grafik: http://s7.directupload.net/images/100910/wr7vyczn.jpg]

    Beim zweiten mal durchschauen, ist mir dann doch aufgefallen, dass bei Wert noch kein "true" auftaucht. Hab jetzt heute aber leider keine Zeit mehr zu testen, woran das liegt.

    Auch ein Danke an die anderen und ein schönes WE
    Michael

    Einmal editiert, zuletzt von Michael_Scott (10. September 2010 um 16:07)