1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Forum
  3. AutoIt 3
  4. Skripte

Suche mit LIKE

  • BugFix
  • 20. Februar 2010 um 17:12
1. offizieller Beitrag
  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 20. Februar 2010 um 17:12
    • Offizieller Beitrag
    • #1

    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]

    Dateien

    _Search_LIKE.au3 1,25 kB – 402 Downloads

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    3 Mal editiert, zuletzt von BugFix (21. Februar 2010 um 22:26)

    • Nächster offizieller Beitrag
  • Blume
    Reaktionen
    7
    Beiträge
    690
    • 20. Februar 2010 um 17:50
    • #2

    Einfach & Genial zugleich :D
    BugFix, Du überraschst uns wirklich immer wieder.... :)
    Kann ich super gebrauchen

    mfg, Blume
    Mein PC | Schon etwas länger her :)

    [Blockierte Grafik: http://www.speedtest.net/result/4338313973.png]

  • SEuBo
    Beiträge
    2.409
    • 20. Februar 2010 um 18:08
    • #3

    Coole Sache. Wenn man RegExp kann ist das allerdings relativ unnötig :P

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

    Calltips automatisch in SciTE eintragen. || DescribeIt - Funktionsheader leicht gemacht

    [size=8]GDI+ Spielereien: Drehende Dreiecke
    [size=8]Meine Tut('s): StringRegExp Tutorial

  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 20. Februar 2010 um 18:11
    • Offizieller Beitrag
    • #4
    Zitat von SEuBo

    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.

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
  • progandy
    Gast
    • 20. Februar 2010 um 18:44
    • #5

    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.

  • PrideRage
    Profi
    Beiträge
    767
    • 20. Februar 2010 um 20:14
    • #6

    Sieht wirklich toll aus.

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • SEuBo
    Beiträge
    2.409
    • 21. Februar 2010 um 01:05
    • #7
    Zitat von BugFix


    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.

    Calltips automatisch in SciTE eintragen. || DescribeIt - Funktionsheader leicht gemacht

    [size=8]GDI+ Spielereien: Drehende Dreiecke
    [size=8]Meine Tut('s): StringRegExp Tutorial

  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 21. Februar 2010 um 10:30
    • Offizieller Beitrag
    • #8

    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.

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    Einmal editiert, zuletzt von BugFix (21. Februar 2010 um 11:25)

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
  • BugFix
    aka McBarby
    Reaktionen
    7
    Beiträge
    11.162
    • 21. Februar 2010 um 22:27
    • Offizieller Beitrag
    • #9

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

    MfG BugFix

    Mein Git | Meine UDF | Array-Tutorial | Bit-Tutorial | Dll-Tutorial | RegExp-Beispiel

    • Vorheriger offizieller Beitrag
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™