Wie filtere ich mit StringRegExp und/oder StringRegExpReplace den linken Teil eines Strings, der vor Chr(0) steht?

  • Ich fasse es nicht... aber nach mehr als einer Stunde StringRegExp-Selbstfolterung ist mir die Lust vergangen... ich bin wohl einfach zu dumm dafür... ich wäre sehr erfreut, wenn mich jemand auf den rechten Pfad stoßen würde!

    Vielen Dank im Voraus!

    Das war mein letzter Versuch...

    AutoIt
    Local $sText = 'Wie filtere ich mit StringRegExp und/oder StringRegExpReplace den linken Teil eines Strings, der vor Chr(0) steht?' & Chr(0) & 'Das will ich auch nicht!!!' & @CRLF
    ConsoleWrite('+ Position des Chr(0) = ' & StringInStr($sText, Chr(0)) & @CRLF)
    $aText = StringRegExp($sText, '(.+[^\x00])', 1) & @CRLF
    _ArrayDisplay($aText, '$aText')
    If UBound($aText) Then
        ConsoleWrite('! Position des Chr(0) = ' & StringInStr($aText[0], Chr(0)) & @CRLF)
        ConsoleWrite('> Mano... wie bekomme ich das Chr(0) und den mistigen Rest dahinter weg?!' & @CRLF)
    EndIf
  • So wie du das im Moment machst, matcht du alles (durch den Punkt) greedy und danach matcht du alles ohne dem Chr(0).

    Du willst aber schon vorher alles ohne Chr(0) matchen, also nimm den Punktoperator weg und verlager das + hinter dem ausgelassenen Chr(0), dann klappt das auch.

    AutoIt
    #include <Array.au3>
    Local $sText = 'Wie filtere ich mit StringRegExp und/oder StringRegExpReplace den linken Teil eines Strings, der vor Chr(0) steht?' & Chr(0) & 'Das will ich auch nicht!!!' & @CRLF
    ConsoleWrite('+ Position des Chr(0) = ' & StringInStr($sText, Chr(0)) & @CRLF)
    $aText = StringRegExp($sText, '([^\x00]+)', 1) & @CRLF
    _ArrayDisplay($aText, '$aText')
    If UBound($aText) Then
        ConsoleWrite('! Position des Chr(0) = ' & StringInStr($aText[0], Chr(0)) & @CRLF)
        ConsoleWrite('> Mano... wie bekomme ich das Chr(0) und den mistigen Rest dahinter weg?!' & @CRLF)
    EndIf
  • Dafür benötigt man auch nicht unbedingt StringRegExp:

    AutoIt
    #include <Array.au3>
    
    Local $sText = 'Wie filtere ich mit StringRegExp und/oder StringRegExpReplace den linken Teil eines Strings, der vor Chr(0) steht?' & Chr(0) & 'Das will ich auch nicht!!!' & @CRLF
    $sText = StringFormat("%s", $sText)
    
    MsgBox(0, "", $sText)
    ConsoleWrite("Position von Chr(0): " & StringInStr($sText, Chr(0), 1, 1))
  • AutoIt
    $array=stringsplit($sText,chr(0),3)
    _arraydisplay($array) ;oder
    msgbox(0,0,$array[0])

    ...oder so...

  • So wie du das im Moment machst, matcht du alles (durch den Punkt) greedy und danach matcht du alles ohne dem Chr(0).

    Du willst aber schon vorher alles ohne Chr(0) matchen, also nimm den Punktoperator weg und verlager das + hinter dem ausgelassenen Chr(0), dann klappt das auch.

    Boar... jetzt, wo ich die Lösung vor Augen habe... ich fasse es nicht, dass ich da nicht selbst drauf gekomen bin!!! :cursing:

    Das hast du übrigens echt super erklärt!!!

    AspirinJunkie / Andy

    Mit StringInStr habe ich es ja lösen können... auf StringFormat und StringSplit wäre ich heut sicher nicht mehr gekommen... beides super Lösungen! Damit steht also fest - ich bin (zumindest heute) zu dumm für diese Welt! 8o

    Wie auch immer, plötzlich kam mir der Gedanke, es mit RegEx lösen zu wollen... welcher mich nun dank alpines wieder ein paar Kilometer weiter gebracht hat, was RegExp angeht!

    Vielen Dank euch allen!

    PS: Andy, schau dir mal die Funktion _dllstructcreate64() in assembleit2_64.au3 genauer an... ==>> "DllStructGetPtr"

    Ich werde dich die Tage aber eh nochmals auf assembleit2_64 ansprechen, weil ich da einige Vorschläge habe, wie man das optimieren kann.

    PPS: Es gibt übrigens auch eine aktuellere fasm.dll... die v0.72.0.0... die ich in meinen geänderten Versionen (LZNT/LZMAT) bereits integriert habe... später mehr dazu...

    Einmal editiert, zuletzt von Bitnugger (2. Januar 2018 um 13:55) aus folgendem Grund: Kleine Ergänzung...