reguläre Suche nach Zahlen und Zahlen in Worte umwandeln

  • Hallo,

    (1)

    reguläre Suche

    $clp_gesprochene_Form = "Omega.6.Fettsäuren und 12 Äpfel sowie .57946. Bananen und -33- Kiwis"

    $Zahl = StringRegExp ( $clp_gesprochene_Form , "\ \d+\ " , 3 ) ; Findet Ziffer (0-9) umschlossen von Leerzeichen -> ".6." und ".57946."

    $Zahl = StringRegExp ( $clp_gesprochene_Form , "\ \d+\ " , 3 ) ; Findet Ziffer (0-9) umschlossen von Leerzeichen -> "12"

    Wie kann ich das umschreiben, damit nach "Leerzeichen beliebige Zahl Leerzeichen" bzw. "Punkt beliebige Zahl Punkt" gesucht wird, aber nur der Zahlenwert ohne Leerzeichen und Punkte zurück gegeben wird?

    Muss ich dazu Stringreplace verwenden oder kann ich das gleich in der regulären Suche so schreiben, dass nur die Ziffern im Ergebnis ausgegeben werden?

    (2)

    Im Thread (Link)

    Zahlen in Worte umwandeln

    fand ich eine Möglickeit, um "Zahlen in Worte umwandeln".

    Der Beitrag ist von 2013 - gibt es eine aktuellere Funktion - ggf. ist so eine Funktionalität jetzt bereits in AutoIt integriert?

    Ich möchte Zahlen in Worte umwandeln, allerdings jede Ziffer für sich:

    Falls es keine Funktion dafür gibt, kann jemand das Script aus obigem Beispiel so umschreiben, dass eine Zahl in einzelne Ziffern = Worte zerlegt wird?

    Aus 57946 soll "fünf sieben neun vier sechs" werden.

    Die Lösung wird wohl in obigem Script bereits enthalten sein, nur gelingt es mir nicht, die unnötigen Zeilen zu löschen bzw. das Script so umzuschreiben.

    Vielen Dank :)

  • Hallo AutoMit,

    hier ein Beispiel zu deiner ersten Frage:

    Code
    #include <Array.au3>
    
    $s = "Omega.6.Fettsäuren und 12 Äpfel sowie .57946. Bananen und -33- Kiwis"
    
    $Zahl = StringRegExp ( $s , "\.(\d+)\." , 3 )
    
    _ArrayDisplay($Zahl)

    und hier ein Beispiel zu deiner zweiten Frage:

    Code
    Local $aZahlen[4] = ["Null", "Eins", "Zwei", "Drei"]
    
    $sTest = "1302"
    
    For $i=0 To UBound($aZahlen)-1
        $sTest = StringReplace($sTest, String($i), $aZahlen[$i])
    Next
    
    ConsoleWrite($sTest & @CRLF)

    LG
    Christoph :)

  • Zu (1), guck mal ob das ungefähr deinen Vorstellungen entspricht.

    AutoIt
    #include <Array.au3>
    #include <StringConstants.au3>
    
    $sTest = "Omega.6.Fettsäuren und 12 Äpfel sowie .57946. Bananen und -33- Kiwis"
    $sPattern = '[\s\.](\d+)[\s\.]'
    
    $aMatches = StringRegExp($sTest, $sPattern, $STR_REGEXPARRAYGLOBALMATCH)
    _ArrayDisplay($aMatches)
  • hier ein Beispiel zu deiner ersten Frage:

    Vielen Dank - die Lösung scheint die Klammer um das Suchmuster zu sein.

    ( ... )

    Eine Gruppe speichert auch den Text ab, der mit dem Set übereinstimmt, um ihn bei einem Rückverweis und in dem Rückgabearray der Funktion zu benutzen, abhängig von dem Flag-Parameter.

    ( laut Hilfe ... also wird bei einer regulären Suche, wenn etwas in Klammern gefasst wird, nur dieser String zurückgegeben? )

    Floops ... das ist eine interessante Anregung ... wieder was gelernt.

    Vielen Dank Euch zwei :)

    und hier ein Beispiel zu deiner zweiten Frage:

    Wow - ich bin beeindruckt, wie kurz sich das schreiben lässt.

    Einmal editiert, zuletzt von AutoMit (10. Oktober 2017 um 16:55)

  • Wow - ich bin beeindruckt, wie kurz sich das schreiben lässt.

    Das geht sogar noch kürzer... ;)

    Code
    Local $sTest = "1302", $aZahlen = ["Null", "Eins", "Zwei", "Drei"]
    ConsoleWrite(Execute(StringRegExpReplace($sTest, '(\d){1}', '$aZahlen[\1]&') & '""') & @CRLF)
  • Das geht sogar noch kürzer... ;)

    Code
    Local $sTest = "1302", $aZahlen = ["Null", "Eins", "Zwei", "Drei"]
    ConsoleWrite(Execute(StringRegExpReplace($sTest, '(\d){1}', '$aZahlen[\1]&') & '""') & @CRLF

    Es tut mir leid, aber wenn hier so ein Unsinn verbrochen wird muss ich doch noch einmal meinen Senf dazu geben.

    Diese "Verbesserung" ist eine furchtbar gefährliche Idee. Der Grund für das Übersetzen von Zahlen in Zahlwörter ist ja höchst wahrscheinlich, dass die Zahlen von außerhalb in das Programm eingegeben werden. Vielleicht werden sie sogar aus dem Netz geladen oä..

    Deshalb ist es eine schlechte Idee diese Eingabe in die Execute-Funktion zu stopfen, da ein potentieller Angreifer einfach einen String wie "1302Beep()&ShellExecute('www.evil-shit.de')" eingeben kann. Was dann passiert könnt ihr ja mal selbst versuchen:

    Code
    Local $sTest = "1302Beep()&ShellExecute('www.evil-shit.de')", $aZahlen = ["Null", "Eins", "Zwei", "Drei"]
    ConsoleWrite(Execute(StringRegExpReplace($sTest, '(\d){1}', '$aZahlen[\1]&') & '""') & @CRLF)

    Generell würde ich empfehlen die Verwendung der Execute-Funktion in Produktivcode zu vermeiden.

    Außerdem ist der "gekürzte" Quellcode meiner Meinung nach sehr schlecht lesbar und vermutlich sogar noch langsamer, als der längere und sichere Code.

    LG
    Christoph :)

  • Hallo BinDannMalWeg !

    Ein im hohen Maße berechtigter Einwand:thumbup:

    Tester sollten aber besser eine Domain ihres Vertrauens einfügen ;)!

    Gruß Musashi

    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."

  • Deinen ersten Satz hättest du dir sparen können! Ansonsten stimme ich dir zu, dass Execute() besser gemieden werden sollte. Und übrigens... dein Beispiel funktioniert mit dem getürkten String nicht.

    Hier noch ein wenig Unsinn... :P

    Code
    Local $sTest = "1302948576Beep()&ShellExecute('www.google.de')", $aZahlen = ["Null", "Eins", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"]
    ConsoleWrite('> ' & Execute(StringRegExpReplace(_ArrayToString(StringRegExp($sTest, '(\d){1}', 3), ''), '(\d){1}', '$aZahlen[\1]&') & '""') & @CRLF)
    
    Local $sTest = "1302948576Beep()&ShellExecute('www.google.de')", $aZahlen = ["Null", "Eins", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"]
    For $i=0 To UBound($aZahlen)-1
        $sTest = StringReplace($sTest, String($i), $aZahlen[$i])
    Next
    ConsoleWrite('! ' & $sTest & @CRLF)

    Unsinn.png

  • Deinen ersten Satz hättest du dir sparen können!

    Tut mir leid falls ich dich damit gekränkt habe.

    Und übrigens... dein Beispiel funktioniert mit dem getürkten String nicht.

    Also bei mir funktioniert das zweizeilige Script. Seltsam. Aber auch egal, ich denke mein Einwand ist angekommen.

    Tester sollten aber besser eine Domain ihres Vertrauens einfügen !

    Die Domain www.evil[bindestrich]shit.de gehört den Betreibern des YouTube-Kanals SemperVideo und sollte daher vollkommen unbedenklich sein. Sie wird durch gängige Firewalls erkannt und gelockt, da auf unerreichbaren Unterseiten des Webservers Malware-Samples gehostet werden.

    Nun aber wieder back to topic. :S

    LG
    Christoph :)

  • Und übrigens... dein Beispiel funktioniert mit dem getürkten String nicht.

    Also bei mir funktioniert das zweizeilige Skript tadellos !

    Es kommt ein Beep, und anschließend wird die von mir angegebene Domain im Browser gestartet -> eine lupenreine Code- bzw. Shell-Injection.

    Die Domain www.evil[bindestrich]shit.de gehört den Betreibern des YouTube-Kanals SemperVideo und sollte daher vollkommen unbedenklich sein.

    War mir schon klar, dass Du keine 'gefährliche' Domain angeben würdest, trotzdem habe ich lieber eine Firmeneigene gewählt.

    Was die Höflichkeitsaspekte eures Dialoges angeht, da halte ich mich mal fein 'raus ^^.

    Gruß Musashi

    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."