REGEXPTITLE - Bestimmte Zeichen "ersetzen"

  • Brauche Hilfe beim Erstellen der RegExp für den Parameter REGEXPTITLE von erweiterten Fenstertiteln.

    Bei WinTextMatchMode 2 (Übereinstimmung einer beliebigen Teilzeichenfolge des Titels) soll ein Fenstertitel gefunden werden, aber ich kann keinen Titel übergeben, der Single Quotes enthält.

    Hintergrund

    Der Aufruf erfolgt als /AutoIt3ExecuteLine aus VBScript, die SingleLine wird umschlossen von doppelten Anführungszeichen, wodurch ich innerhalb der SingleLine einfache Anführungzeichen benutzen kann, z.B. um Parameter für Funktionen zu umschließen. Wenn nun ein Titel übergeben wird, der seinerseits Single Quotes enthält, streikt der Parser.

    Deshalb ersetze ich vor dem Aufruf Single Quotes im Titel durch Fragezeichen "?". Nun brauche ich quasi eine Rückwandlung von "?" in Single Quotes, aber REGEXPTITLE ist kein StringRegExpReplace(). Wie sagt man REGEXPTITLE, dass nach Single Quotes anstelle der "?" gesucht werden soll?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Irgendwie bisschen wirr.

    Oben schreibst du erst was vom WinTextMatchMode, dann willst du wieder stattdessen den Titel suchen.

    Ich habe noch nicht ganz verstanden was das mit den Fragezeichen soll.
    Du parst einen AutoIT-String aus VB heraus irgendwie?
    Keine Ahnung was du da machst aber in VB werden einfache Anführungszeichen durch Backslash escaped: ' --> \' und in AutoIt durch Dopplung: ' --> ''.
    Je nach dem wo der String jetzt nun geparsed wird musst du halt die entsprechende Escape-Variante verwenden.

  • Oben schreibst du erst was vom WinTextMatchMode, dann willst du wieder stattdessen den Titel suchen.

    Entschuldigung, es war für mich ziemlich schwierig ein komplexes Problem auf eine einfache Ebene herunterzubrechen. Deshalb ist mir ein Flüchtigkeitsfehler durchgerutscht! Bitte töte mich jetzt nicht! =O Da ich überall von Titel und Fenstertitel gesprochen habe, kannst du dir schon denken: Gemeint war "WinTitleMatchMode"!

    Dein Hinweis auf das Escapen durch Doppelung hat das Problem gelöst! Vielen Dank dafür! :thumbup:

    Die Komplexität dieses Problems und anderer Probleme, die zwangsläufig mit damit verbunden sind, hat mich an viele meiner Grenzen geführt. 8| So habe ich schon früher nach Escape Squenzen recherchiert, aber da es in AutoIt sowohl einfache als auch doppelte Anführungszeichen gibt, habe ich da nie eine Doppelung benötigt.

    In diesem speziellen Fall wird in zwei Sprachen gleichzeitig programmiert: VBScript und AutoIt3. Da treffen wirklich zwei Welten aufeinander! Jeder der das versucht hat, weiß wovon ich rede. Punkt ist, dass ich oft nicht weiß, welche Sprache im jeweiligen Fall die Grenzen setzt. Wenn ich z.B. wie in diesem Fall in VBScript AutoIt-Anweisungen schreibe, die per /AutoIt3ExecuteLine benutzt werden, verwischen die Grenzen oft sehr schnell. Der langen Rede kurzer Sinn: Dieser alte Mann hat seine Grenzen! ;)

    Das Problem ist gelöst. Für diejenigen, die trotzdem ein paar Hintergrundinformationen wollen:

    Spoiler anzeigen

    Ich habe noch nicht ganz verstanden was das mit den Fragezeichen soll.
    Du parst einen AutoIT-String aus VB heraus irgendwie?

    Keine Ahnung was du da machst ...

    Ich versuche mal ein wenig Licht in die Hintergründe zu bringen.

    Große Bitte: Die folgenden Angaben sind mehr oder weniger aus dem Gedächtnis geschrieben. Da mag nicht jeder Punkt, jedes Komma oder jedes Anführungzeichen korrekt oder auch Schreibfehler drin sein, aber man kann verstehen was gemeint ist. Bitte sei nachsichtig. :)

    Im Folgenden nenne ich das einfache Anführungszeichen "SQ" (Single Quote), das doppelte Anführungszeichen "DQ" (Double Quote).

    Aus VBScript wird AutoIt3.exe aufgerufen mit dem Parameter /AutoIt3ExecuteLine, gefolgt vom String, der die SingleLine-Befehle enthält. Beispiel:

    "... AutoIt3.exe" /AutoIt3ExecuteLine "MySingleLine"

    MySingleLine enthält die gewünschten Befehle/Funktionen plus deren Parameter. Als Beispiel mein konkreter Fall:

    Code
    MySinlgeLine = "ConsoleWrite(Opt('WinTitleMatchMode', 2) & ControlCommand(WinGetHandle('" & getVarValue("%FullFileName%") & "'), '', 'TPageControl1', 'IsVisible', ''))"

    VBScript kennt nur DQs, deshalb wird MySingleLine mit DQs umgeben, siehe oben: "...AutoIt3.exe" /AutoIt3ExecuteLine "MySingleLine".

    Das heißt: Außen um MySinlgeLine sind DQs, doppelte Anführungszeichen. Innerhalb von MySinlgeLine können deshalb nur SQs, also einfache Anführungzeichen benutzt werden. Wie man im Beispiel oben erahnen kann, wird mit getVarValue("%FullFileName%") ein Dateipfad übergeben. Ein Dateipfad kann in Windows KEINE DQs enthalten, aber er kann SQs enthalten. Wenn ein Dateipfad OHNE SQs übergeben wird funktioniert der o.g. Aufruf wie er soll. Wenn der Dateipfad allerdings SQs enthält, wird das SQ von AutoIt als (wie nennt man das?) String-Literalbegrenzer (?) verstanden und der o.g. Aufruf auseinander gerissen!

    Zum Beispiel: Wird als Dateipfad 'D:\'Hallo Welt!'.au3' übergeben, wird folgender Fehler geworfen:

    Code
    ---------------------------
    AutoIt Error
    ---------------------------
    Line 1:
    
    ConsoleWrite(Opt('WinTitleMatchMode', 2) & ControlCommand(WinGetHandle('D:\'Hallo Welt!'.au3'), '', 'TPageControl1', 'IsVisible', ''))
    ConsoleWrite(Opt('WinTitleMatchMode', 2) & ControlCommand(WinGetHandle('D:\'Hallo Welt^ ERROR
    
    Error: Unable to parse line.

    Keine Ahnung was du da machst aber in VB werden einfache Anführungszeichen durch Backslash escaped: ' --> \' und in AutoIt durch Dopplung: ' --> ''.
    Je nach dem wo der String jetzt nun geparsed wird musst du halt die entsprechende Escape-Variante verwenden.

    Tja, da hatte ich wohl zu kompliziert gedacht, denn das war die Lösung. Nochmals vielen Dank dafür! :)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.