Kürzen bei mehrfachem StringRegExpReplace in direkter Folge ???

  • Moin Moin

    Was für eine Themaüberschrift. :rofl:

    Kann man nachfolgede Funktion kürzen?

    Bestimmt, nur wie? :/

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Dank der Suchfunktion und sehr viele Ergebnisseiten habe ich die Lsg. gefunden. Danke an Musashi für seinen Beitrag v. 06.11.2017 mit dem Titel: "regexreplace".
    Das ist mal kurz. Nicht das mein o. g. nicht auch die Lsg. ausgegeben hätte.


    edit des Beitrag:

    Hier noch mal ein vorher / nachher:

    @@ Vorher =

    9026230723930410930234332531610232133013323321070341302343325109326340321434130819113315514910921321021219570240259341325124340341307322126194174258174

    @@ Nachher =

    90262307239304A9302343325316A232D30D32332A7034D02343325A932634032E34D0819B33F5E9A92D2A2C1957024025934D25C434034D07322C6194174258174


    Kleiner Nebeneffekt, der String wird kürzer.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    3 Mal editiert, zuletzt von Alina (25. Juni 2022 um 17:20)

  • Hi :)

    Das hängt natürlich davon ab, wie genau das Muster aussieht, bzw. was das Ziel ist.

    So wie ich es aus deinem Beispiel sehe (Bei den Inputs sind die Zahlen manchmal glaub ich falsch => Copy and Paste fehler vermut ich mal) wäre meine Lösung so:

    Einmal Rekursiv und einmal als Schleife.

    Die Schleife solltest bevorzugt werden, da Rekursion begrenzt ist (Anzahl verschachtelter Funktionsausrufe ist begrenzt).

    MfG, Kanashius.

  • Achtung! Hier lauert ein anderer Fehlerteufel!

    Was passiert, wenn die Zeichenkette folgendermaßen lautet: "0201150114"?

    Dann werden die "11" durch "B" ersetzt, obwohl es eigentlich "15" = "F" und "14" = "E" wären.

    Wenn hier eine Wandlung nach Hex erfolgen soll, dann erstmal ein Array mit jeweils 2 Stellen erstellen und erst danach umwandeln.

    Also:

    Code
    #include <Array.au3>
    $sText = "0201150114"
    $aText = StringRegExp($sText, '(.{2})', 3)
    _ArrayDisplay($aText)
  • Alina

    Ob Regexp oder Textdurchlauf. Du wirst immer das gleiche Problem haben, wenn du den Text mit jedem Durchlauf änderst.

    Du VERÄNDERST den Text.

    Such nur nach deinen Suchbegriffen in den relevanten Schritten und speichere die Suchstellen.

    Danach gehe von hinten nach vorne duch und ersetze die Treffer.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (25. Juni 2022 um 19:42)

  • Das ist mal kurz. Nicht das mein o. g. nicht auch die Lsg. ausgegeben hätte.

    Natürlich kann man das so lösen. Aber ich sehe keinen vernünftigen Grund die Regexfunktionen zu verwenden. Deren Nutzen ist doch unterschiedlichen Text mit bestimmten Mustern zu filtern.

    Du ersetzt doch aber nur feste Textwerte mit anderen festen Textwerten. ("10" mit "A", "11" mit "B" usw.)

    Dafür gibt es StringReplace. Und unbedingt den Hinweis von Oscar beachten. Denn das funktioniert nur, wenn jede Ziffer 2-stellig dargestellt ("01", "02".."10") und auch in 2-er Blöcken verarbeitet wird.

    EDIT:

    Wobei - Es ist Umwandeln zu Hex. Dafür gibt es die Funktion Hex. Wenn Deine Zahlenblöcke nicht größer als 15 sind (dürfen sie nicht sein! sonst wird der Hexstring unterschiedlich lang, was es unmöglich macht, den Ausgangsstring zu reproduzieren - was ja wohl dein Ziel ist) in einer Schleife über den String iterieren und mit $sResult &= Hex(StrMid(STR, pos, 2), 1) umwandeln.

  • @@ Vorher =

    9026230723930410930234332531610232133013323321070341302343325109326340321434130819113315514910921321021219570240259341325124340341307322126194174258174


    @@ Nachher =

    90262307239304A9302343325316A232D30D32332A7034D02343325A932634032E34D0819B33F5E9A92D2A2C1957024025934D25C434034D07322C6194174258174


    Kleiner Nebeneffekt, der String wird kürzer.

    Da stellt sich mir die Frage: Was soll das sein/werden?

    Wenn da jeweils zwei Chars eine Zahl darstellen, warum dann als String speichern?

    Als Byte-Array würde das Ganze nur die Hälfte an Speicher brauchen.

  • Moin Zusammen.

    Es dient rein dem Zweck, einen String aus X Ziffern "unverständlicher" zu machen. Ja, es soll nach "hex" aussehen, aber es ist wirklich nur dafür da, etwas noch mehr zu "verstecken".

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Danke an Musashi für seinen Beitrag v. 06.11.2017 mit dem Titel: "regexreplace".

    (der Vollständigkeit halber)

    In dem Thread regexreplace , aus dem Du mein Beispiel entnommen hast, ging es primär um einen Vergleich der Verarbeitungsgeschwindigkeit von StringReplace  und StringRegExpReplace.

    Dort habe ich exemplarisch wie folgt substituiert :

    [['Ä', '1'], ['Ö', '2'], ['Ü', '3'], ['ä', '4'], ['ö', '5'], ['ü', '6'], ['ß', '7']]

    bzw.

    [['Ä', 'Ae'], ['Ö', 'Oe'], ['Ü', 'Ue'], ['ä', 'ae'], ['ö', 'oe'], ['ü', 'ue'], ['ß', 'ss']]

    Dein Array [[10, 'A'], [11, 'B'], [12, 'C'], [13, 'D'], [14, 'E'], [15, 'F']] lässt allerdings vermuten, dass Du von Dezimal zu Hex umwandeln möchtest. Dabei könnte der von Oscar beschriebene Fehlerteufel zuschlagen.

    EDIT : gerade gelesen :

    Es dient rein dem Zweck, einen String aus X Ziffern "unverständlicher" zu machen. Ja, es soll nach "hex" aussehen, aber es ist wirklich nur dafür da, etwas noch mehr zu "verstecken".

    Ich würde es nicht zu sehr verkomplizieren ;) .

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ich hab jetzt einfach mal die Sinnhaftigkeit der Aufgabenstellung komplett ignoriert und das ganze nur stupide als Contest "Wer kriegt es am kürzesten hin" interpretiert. ^^

    Ich werfe hierzu folgenden Hut in den RIng:

    AutoIt
    $sInput = "01234567891011121314151617181920"
    $sOutput = Execute("'" & StringRegExpReplace($sInput, '1[0-5]', "' & Chr(\0 + 55) & '") & "'")
    Msgbox(0, "", $sOutput)

    Edit: Und wenn man Oscars Bedingung, dass immer nur 2er-Paare betrachtet werden sollen, auch noch mit dazu nehmen möchte, dann so:

    AutoIt
    $sInput = "01234567891011121314151617181920"
    $sOutput = Execute("'" & StringRegExpReplace($sInput, '1[0-5]|..(*SKIP)(*F)', "' & Chr(\0 + 55) & '") & "'")
    ConsoleWrite($sOutput & @CRLF)

    3 Mal editiert, zuletzt von AspirinJunkie (26. Juni 2022 um 20:46) aus folgendem Grund: noch ein μ kürzer

  • Ja, es soll nach "hex" aussehen, aber es ist wirklich nur dafür da, etwas noch mehr zu "verstecken".

    Entschuldige, aber eine Verschlüsselung, die auf verstecken basiert, übersteht keinen ernsthaften Angriff.

    Schon gar nicht, wenn sie in AutoIt geschrieben ist.

    Du solltest in Erwägung ziehen, eine vorhandene sichere Verschlüsselung zu verwenden.

  • EDIT : gerade gelesen :

    Ich würde es nicht zu sehr verkomplizieren ;) .

    Ja, das war es dann ja auch. Nichts wird mehr komplizierter gemacht. Versprochen? Irgendwann kann auch ich es nicht mehr im Kopf wieder lösen und ich weiß wie das Script arbeitet. ;)

    Entschuldige, aber eine Verschlüsselung, die auf verstecken basiert, übersteht keinen ernsthaften Angriff.

    Entschuldige, aber eine Verschlüsselung, die auf verstecken basiert, übersteht keinen ernsthaften Angriff.

    Schon gar nicht, wenn sie in AutoIt geschrieben ist.

    Du solltest in Erwägung ziehen, eine vorhandene sichere Verschlüsselung zu verwenden.

    Oscar . Wir kennen uns doch schon soooo lange. Das es kein Angriff ernsthaft stand hält weiß ich nicht. Klar kann man das Ganze dann evtl. irgendwie wieder zurück "crypten", aber

    damit wird nichts "TOP SECRET" oder der Gleichen verschlüsselt, sondern nur einiges vor Neugierde geschützt.
    -
    Für ernsthafte Sachverhalte nutze ich die vorhandelen und sichereren Verschlüsselungen. AutoIt hat da finde ich ausreichend Möglichkeit für ernste Sachverhälte.

    AspirinJunkie
    Erstes Script kommt auf das gleiche Ergebnis, das zweite bearbeitet die erste '12' nicht.
    Mich würde interessieren, was das mit folgenden auf sich hat: Chr(\0 + 55). Wieso gerade +55 und wieso sowieso etwas zu einer Sache dazu addieren? Woher kommt die 55? Das wird mich jetzt wirklich nicht zur RUhe kommen lassen.

    Aber Thema ist aus meiner Sicht "erledigt".

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Erstes Script kommt auf das gleiche Ergebnis, das zweite bearbeitet die erste '12' nicht.

    Erstes soll dein Beispiel reproduzieren und das zweite Oscars Hinweis, dass ja im Grunde nur Paare betrachtet werden sollen. Im konkreten Beispiel steht vor der 12 nur 1 Zeichen, weswegen diese nicht gematcht wird.

    Zu der 55: Du hast eine Zuordnung vorgegeben, dass 10 = A, 11 = B, C = 12 usw. ist. Am Ende hat man halt als Input z.B. eine 11 und der Buchstabe B muss rauskommen.
    Wenn man sich die ASCII-Tabelle anschaut, dann stehen auch dort Buchstaben hintereinander. Allerdings beginnend mit A bei Position 65.
    Um nun über die ASCII-Tabelle aus der 11 ein B zu machen, muss man nun also noch 55 addieren und kann so mit Chr() sich den entsprechenden Buchstaben zurückgeben lassen.