Registry Schlüssel per Regex erkennen und unerwünschte Zeichen entfernen

  • Hallöchen erstmal, ich bin der Neue und ich will gleich mal ein bisschen rumnerven... :D

    Wie der Titel schon sagt, habe ich ein Problem mit Regex.
    Ich möchte aus einem bliebigen String evtl. enthaltene Registry Schlüssel auslesen und weiterverarbeiten.
    In RegexBuddy habe ich auch ein funktionierendes Pattern erstellen können, aber wenn ich versuche, diesen mithilfe von StringRegExpReplace zu benutzen, klappts nicht.
    Zur Verdeutlichung, hier mal ein Screenshot:
    [Blockierte Grafik: http://i.imgur.com/ImH4s.png]
    Was ich noch nicht hinbekommen habe, ist ein Leerzeichen im abschliessenden Verzeichnis zu erkennen (z.B. HKEY_CURRENT_USER\Control Panel\Microsoft Input Devices) und Links mit Zeilenumbruch (siehe letztes Beispiel im Screenshot).
    Falls dafür jemand ne Lösung hat, wäre ich auch nicht abgeneigt :whistling:

    Das ist aber nicht so tragisch, wichtiger ist mir die Umsetzung in Autoit. Folgendes Mini-Script liefert leider nicht die erwünschten Ergebisse:

    [autoit]

    Do
    $RegKey = InputBox( "Eingabe", "Hier Registry Schlüssel einfügen:", Default, Default, 400, 130)
    $RegeXed_find = StringRegExpReplace( $RegKey, "((?i)(HK)(.+)(\\\w*))", "$1") ;==> Pattern 1
    $RegeXed_space = StringRegExpReplace( $RegKey, "(\s{0,}\\\s{0,})", "\") ;==> Pattern 2
    $RegKey = MsgBox( 5, "", "Pattern 1: " & $RegeXed_find & @CRLF & @CRLF & "Pattern 2: " & $RegeXed_space)
    Until $RegKey = 2
    Exit

    [/autoit]


    Ich vermute, mein Fehler liegt im Backreference Wert ("$1"). Dort habe ich aber alle möglichen Kombinationen versucht, z.B.:

    Code
    "$0"
    "$1$2$3$4"
    "\0"
    "\1\2\3\4"
    ...

    Auch für das Löschen von Leerzeichen vor und nach dem Backslash (\) habe ich ein Pattern erstellt, daß einwandfrei in RegexBuddy funktioniert (auch der Zeilenumbruch im letzten Beispiel wird entfernt), aber in Autoit schaff ichs nicht (Pattern 2 im Script):
    [Blockierte Grafik: http://i.imgur.com/aiLcw.png]
    Das läßt sich natürlich auch mit StringReplace bewerkstelligen, aber Regex wäre mir schon lieber...

    Habe ich irgenwo Fehler in den Pattern oder bin ich einfach nur unfähig, StringRegExpReplace richtig zu "bedienen"? ;(

    Eine weitere Frage hätte ich noch:
    Gibts eine Möglichkeit, Text mit Zeilenumbruch per Rechtsklick aus der Zwischenablage in ein Inputfeld zu bekommen?
    Das Einlesen mit ClipGet() in eine Variable und darauf folgendes Einfügen mit GUICtrlSetData klappt, Rechtsklick nicht.

    :thumbup: Faster than 97% of DE :thumbup:

    6 Mal editiert, zuletzt von Friesel (16. November 2012 um 09:14) aus folgendem Grund: Bilder wurden nicht angezeigt, da die URLs im Quellcode-Modus falsch interpretiert wurden...

  • Was ich noch nicht hinbekommen habe, ist ein Leerzeichen im abschliessenden Verzeichnis zu erkennen (z.B. HKEY_CURRENT_USER\Control Panel\Microsoft Input Devices)


    Wenn man deinen Beispieltext aus den Screenshots so ansieht sollte mir das als Mensch auch gar nicht möglich sein.
    Einmal gehören dort die Wörter nach dem Leerzeichen zum Pfad, ein andermal wiederrum nicht.
    Nur mit Stringregeln lassen sich diese Fälle nicht unterscheiden.
    Poste mal einen Beispieltext in Textform (möchte das nicht abtippen) und sage gleichzeitig wie das gewünschte Endergebnis aussehen soll.
    Dann kann man mal selbst probieren.


  • Wenn man deinen Beispieltext aus den Screenshots so ansieht sollte mir das als Mensch auch gar nicht möglich sein.
    Einmal gehören dort die Wörter nach dem Leerzeichen zum Pfad, ein andermal wiederrum nicht.
    Nur mit Stringregeln lassen sich diese Fälle nicht unterscheiden.
    Poste mal einen Beispieltext in Textform (möchte das nicht abtippen) und sage gleichzeitig wie das gewünschte Endergebnis aussehen soll.
    Dann kann man mal selbst probieren.

    Erstmal danke für die Antwort :)

    Das das mit den Leerzeichen im abschließenden Verzeichnis wohl nicht möglich ist, dachte ich mir schon.
    Ich hoffte nur, daß vieleicht jemand 'nen tollen "Zaubertrick" im Ärmel hat ;)
    Aber wie ich schon geschrieben hab, ist das nicht so tragisch, wenns nicht klappt...

    Mir geht es einfach darum, Registry Links aus einer Textdatei oder einer der zahlreichen Internetseiten, die Registry Tricks veröffentlichen, zu filtern.
    Das Endergebnis soll ein kompatibler Link sein, wie er zb in exportierten Schlüsseln steht (*.reg Dateien).

    Code
    Windows Registry Editor Version 5.00
    
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
    "ClearPageFileAtShutdown"=dword:00000001


    Die umschliessenden Klammern sind egal und auch der Wert muss nicht gelesen werden, nur der eigendliche Schlüssel (auch wenns cool wäre, wenns dafür ne Lösung gäbe).
    Also z.B. von hier:
    http://digitalewelt.freenet.de/softwareos/win…70_1055218.html

    Hier mal ein relevanter Auszug aus der Seite (erster Link mit Zeilenumbruch, zweiter normal und dritter mit falsch gesetztem Leerzeichen):


    Hier die Links zu extrahieren, sollte kein Probem sein, da sie von Anführungszeichen umschlossen sind. Es gibt aber genügend andere Seiten, die das nicht so vorbildlich machen...

  • Für dein Beispiel hier habe ich es so gelöst:

    Spoiler anzeigen
    [autoit]

    Global Const $s_Source = "Windows XP: Brennen von CDs" & @CRLF & _
    "Unter „Hkey_Current_User\Software\Microsoft\Windows\" & @CRLF & _
    "CurrentVersion\Policies\Explorer“ deaktivieren Sie die Brennfunktion von Windows. Setzen Sie den Standard-Wert dazu auf „1“ . Das ist beispielsweise zum Schutz firmeninterner Daten sinnvoll." & @CRLF & _
    "" & @CRLF & _
    "Windows XP & 2003: Systemlautsprecher" & @CRLF & _
    "Wen das Piepgeräusch des Systemlautsprechers nervt, deaktiviert diesen unter „Hkey_Current_User\Control Panel\Sound“, indem er den Wert „yes“ auf „no“ setzt." & @CRLF & _
    "" & @CRLF & _
    "Windows NT, 2000, XP, 2003, Vista: Reboot nach Absturz" & @CRLF & _
    "Unter „Hkey_Local_Machine\ SYSTEM\CurrentControlSet\Control\CrashControl“ verhindern Sie mit einer Null den automatischen Neustart bei einem Windows-Absturz. Das kann bei der Fehler-Analyse sinnvoll sein."

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

    Global Const $s_Pattern = '(?x)(?m)(?i) # RegEx-Optionen' & @CRLF & _
    '((?:HKEY_LOCAL_MACHINE|HKEY_USERS|HKEY_CURRENT_USER|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKLM|HKU|HKCU|HKCR|HKCC)\\ #Key-Anfang' & @CRLF & _
    '[A-Za-z0-9\.\s\\]+) # hier alle Zeichen eintragen die als Name eines Registryschlüssels erlaubt sind'

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

    For $i In StringRegExp($s_Source, $s_Pattern, 3)
    ConsoleWrite(StringReplace(StringReplace($i, @LF, ""), @CR, "") & @CRLF)
    Next

    [/autoit]


    Inwiefern du dies als allgemeingültige Lösung verwenden kannst weiß ich natürlich nicht.
    Vielleicht ist es aber einfach mal ein etwas anders gedachter Ansatz.

  • Vielen Dank!
    Sieht ja soweit ganz gut aus, auch wenn ich eigendlich gehofft hatte, daß das irgendwie mit einem einzelnen Pattern (wie zb meinem :whistling: ) funktioniert.
    Den Code werde ich mir später genauer ansehn, jetzt habe ich leider nur wenig Zeit.
    Ein "Fehler" ist mir allerdings schon aufgefallen, denn das Leerzeichen nach dem Backslash im dritten Beispiel wird nicht entfernt ( \ SYSTEM\ ).

  • Es soll ja auch gar nix entfernt werden.
    Das Pattern filtert lediglich die potentiellen Registry-Zweige aus.
    Anpassungen an diesen Strings können nachträglich vorgenommen werden (wie hier z.b. die Zeilenumbrüche zu entfernen).
    Das Rausfiltern und die Bereinigung in einem einzigen StringRegExpReplace unterzubringen ist hier eher nicht ratsam.