• Offizieller Beitrag

    Wer mit SQL arbeitet kennt LIKE, um maskiert zu suchen.
    In AutoIt können wir das mit RegEx erledigen. Da damit doch so mancher seine Probleme hat, habe ich die Syntax von LIKE verwendet ('_' =Platzhalter für ein beliebiges Zeichen an dieser Stelle; % =Platzhalter für eine beliebige Zahl von Zeichen, auch 0) und setze das intern in eine Regex-Prüfung um.
    Im Unterschied zu LIKE, das immer case-sensitiv ist, kann hier die Sensitivität gewählt werden. Standard ist False.

    Edit3:
    Erweiterung:
    Der zu prüfende String kann jetzt auch Zeilenumbrüche (@CR oder @CRLF) enthalten.

    Edit2:
    War noch ein Fehler drin beim An-/Abschalten der Metacharacter Erkennung.

    Edit:
    Habe progandys Hinweis jetzt eingearbeitet.

    _Search_LIKE( )
    [autoit]


    Local $aTest[5] = [60123,62345,54175,62340,'C:\Code\Test.au3']

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

    For $i = 0 To 4
    If _Search_LIKE($aTest[$i], '6%') Then ConsoleWrite('erste Position eine 6 - ' & $aTest[$i] & @CRLF)
    If _Search_LIKE($aTest[$i], '6%0') Then ConsoleWrite('erste Position eine 6, letzte eine 0 - ' & $aTest[$i] & @CRLF)
    If _Search_LIKE($aTest[$i], '__1%') Then ConsoleWrite('dritte Position eine 1 - ' & $aTest[$i] & @CRLF)
    If _Search_LIKE($aTest[$i], '__3%') Then ConsoleWrite('dritte Position eine 3 - ' & $aTest[$i] & @CRLF)
    If _Search_LIKE($aTest[$i], '%test.au3') Then ConsoleWrite('test.au3 im Pfad - ' & $aTest[$i] & @CRLF)
    ConsoleWrite(@CRLF)
    Next

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

    ;===============================================================================
    ; Function Name: _Search_LIKE($sTest, $sMask, $fCasesens=False)
    ; Description: Prüft String auf Übereinstimmung mit Suchmaske
    ; Parameter(s): $sTest - der zu prüfende String
    ; Requirement(s): $sMask - die Suchmaske, analog zu LIKE in SQL
    ; _ =Platzhalter f. EIN beliebiges Zeichen an dieser Stelle,
    ; % =Platzhalter f. eine beliebige Menge von Zeichen
    ; $Casesense - False (Standard), nicht case-sensitiv
    ; Return Value(s): 1 - Übereinstimmung mit Suchmaske
    ; 0 - keine Übereinstimmung
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _Search_LIKE($sTest, $sMask, $fCasesens=False)
    Local $pattern = '^'
    If Not $fCasesens Then $pattern &= '(?i)'
    $pattern &= '\Q' & StringRegExpReplace($sMask, '\\E', '\\E\\\\E\\Q')
    $pattern = StringRegExpReplace(StringRegExpReplace($pattern, '%', '\\E.*\\Q'), '_', '\\E.\\Q') & '\E\z'
    $sTest = StringRegExpReplace($sTest, '\r\n|\r', ' ')
    Return StringRegExp($sTest, $pattern)
    EndFunc ;==>_Search_LIKE

    [/autoit]
    • Offizieller Beitrag

    Rein interessehalber: Warum ist denn ']' nicht bei den Metachars?
    Und was ist mit '{' und '}' ?


    Weil diese Zeichen keine besondere Bedeutung haben. Ausschließlich die 11 aufgeführten Zeichen haben eine Doppelfunktion und müssen deshalb maskiert werden.

  • Man kann die Erkennung von Zeichen auch zeitweise ausschalten mit \Q und mit \E wieder anschalten. Dann muss man nur \E als \\EE\Q maskieren.


  • Weil diese Zeichen keine besondere Bedeutung haben. Ausschließlich die 11 aufgeführten Zeichen haben eine Doppelfunktion und müssen deshalb maskiert werden.

    Vielleicht hab ich ja was übersehen, aber {...} wird 1. zur Quantifizierung, und 2. zum "trennen" von Backreferenze und richtigen Zahlen verwendet.

    Ansonsten kannst du mir aber mal sagen, warum das hier nicht funktioniert:

    [autoit]

    MsgBox(0,"",_Search_LIKE("test{2}","t__t{2}"))

    [/autoit]

    Bzw. warum das hier funktinoiert (was es ja eigenltich nicht sollte ;) )

    [autoit]

    MsgBox(0,"",_Search_LIKE("tt","t{2}"))

    [/autoit]


    Außerdem: Wenn du schon [ maskierst, solltest du das auch mit ] machen.
    Sonst versuchst du ja im RegExp eine Zeichenklasse zu schließen, die nie geöffnet wurde.
    Ich bin mir fast sicher, dass das auch zu Laufzeitfehlern im RegExp führen wird.

    • Offizieller Beitrag

    Betreff der geschweiften Klammern hast du recht, die hab ich glatt vergessen. 8|
    Aber sowohl bei geschweifter als auch bei eckiger Klammer muß nur die öffnende Klammer maskiert werden. Die schließenden Klammern alleinstehend werden von der Regex-Engine als normale Zeichen behandelt. Probier es aus - gibt keine Fehler.

    Neue Version in Post 1.
    Habe den Tipp von progandy umgesetzt.