ArrayBinarySearch mit Regex

  • Abend Zusammen,

    ich bins mal wieder :whistling:

    Folgendes Problem:
    Ich habe ein Array welches ich mit ArrayBinarySearch durchsuchen möchte.
    Das funktioniert auch, solange ich den richtigen namen des Feldes eingeben bzw. den vollständigen.

    Bsp. Feldname: "IchBin.test ein Feld"

    Nun möchte ich aber auch alles andere finden was mit "IchBin." anfängt.

    Dachte da an:
    _ArrayBinarySearch($array,$StringRegExp ("IchBin", "(.*)"))

    Funktioniert aber leider nicht.

    Jemand ne Idee?

    Danke euch :)

  • Eine binäre Suche basiert auf einem Elementvergleich auf Größer, Kleiner, Gleich von Elementen.
    Eine Matching per regulären Ausdruck liefert nur passt oder passt nicht.
    Es ist mir daher nicht klar wie eine binäre Suche per RegExp funktionieren soll.
    Eine normale sequentielle Suche wäre hingegen möglich.

  • Eine binäre Suche basiert auf einem Elementvergleich auf Größer, Kleiner, Gleich von Elementen.
    Eine Matching per regulären Ausdruck liefert nur passt oder passt nicht.
    Es ist mir daher nicht klar wie eine binäre Suche per RegExp funktionieren soll.
    Eine normale sequentielle Suche wäre hingegen möglich.

    Sprich mit _ArraySearch?
    Das habe ich am Anfang versucht aber da habe ich das gesuchte üverhaupt nicht gefunden bzw. konnte nicht unterscheiden zwischen gefunden und nicht gefunden.

  • Was?

    Im Prinzip brauchst du nur ne For-Schleife und ein If StringRegExp(...) Then und fertig ist deine Suche.

    Kannst du mir das näher erläutern?

    Ich versteh nich was das mit ner Schleife zutun hat und wie genau dann mein StringRegExp aussehen muss.

  • Eine Schleife benötigst du um alle Elemente des Arrays einzeln durchzugehen.
    Mit StringRegExp prüfst du hierbei das jeweils aktuelle Element auf Übereinstimmung.
    Das If-Then benötigst du dann um auf den Fall zu reagieren wenn StringRegExp eine Übereinstimmung gemeldet hat.

  • Ja das hab ich mir angeschaut und war etwas von der Menge erschlagen :D
    Daraufhin hab ich mir nen Autoit Regex Editor runter geladen und mit .* hat das dann funktioniert.
    Die Frage ist nur wie ich das jz in StringRegExp packe..

  • AutoIt
    $sTestString = "IchBin.test ein Feld"
    StringRegExp($sTestString, "^IchBin\..+")

    Probier es mal so. Bin zwar kein RegEx-Experte, aber sollte funktionieren.

    Einmal editiert, zuletzt von Floops (25. August 2017 um 08:29)

  • Hallo @Paul01 !

    Stimmt dann mein Regex?
    $StringRegExp ("IchBin", "(.*)")

    Wie @AspirinJunkie schon schrieb, Nein !
    (Nebenbei : StringRegExp ist eine Funktion keine Variable, also StringRegExp nicht $StringRegExp)

    Dachte im ersten Parameter der Text und im zweiten der Regex.

    Im ersten Parameter steht nicht WAS Du suchst, sondern der zu prüfende String (würden alle Strings "IchBin" lauten, dann wäre die Suche ja unnötig ^^ ).
    Im zweiten Parameter steht das Suchmuster des regulären Ausdrucks MIT DEM Du prüfst. Erfüllt der String das Muster dann liefert StringRegExp TRUE, ansonsten FALSE.

    Nun möchte ich aber auch alles andere finden was mit "IchBin." anfängt.

    Die Antwort von @Floops : StringRegExp($sTestString, "^IchBin\..+") ist ok, aber ggf. unvollständig.
    (.+) bedeutet : hinter "IchBin." können beliebige Zeichen folgen, aber mindestens Eins.
    "IchBin." entspräche nicht dem Muster ! Falls Du auch zulassen möchtest, dass KEIN Zeichen folgen darf, dann muss man (.*) verwenden. Es gibt also die Varianten :
    1. StringRegExp($sTestString, "^IchBin\.(.+)$") 
    2. StringRegExp($sTestString, "^IchBin\.(.*)$")


    Hinweis :
    Reguläre Ausdrücke in AutoIt berücksichtigen standardmäßig Groß-/Kleinschreibung. "IchBin" ist also NICHT GLEICH "ichbin" ! Falls Du Groß-/Kleinschreibung ignorieren möchtest, dann kannst Du (?i) an den Anfang des Pattern stellen, d.h :
    StringRegExp($sTestString, "(?i)^IchBin\.(.+)$")

    oder
    StringRegExp($sTestString, "(?i)^IchBin\.(.*)$")

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."