getPos() - InStr() trifft Array-Object

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

getPos() - InStr() trifft Array-Object

06 Jun 2022, 06:21

WARNUNG! Hier folgt nun nichts wirklich Welt-bewegendes, und dazu auch noch RegEx-free. :shh: So, be it.
:arrow: InStr() bietet (AFAIK) per default keine Option an, um "zeitgleich" mehrere Nadeln im Heuhaufen zu suchen.

getPos() erlaubt statt eines einzelnen "needle"-string mehrere needles im ["simple","array","object","stil"] zu übergeben.
Rück-/Ausgabe erfolgt dann in Array-Schreibweise, hier dem Beispiel entsprechend: pos.<needle> bzw. pos[needle]

Wird für den 'occurence'-Parameter der Wert '0' gesetzt, enthält die Rückgabe die Gesamtsumme für das (case sensitive) Vorkommen der jeweiligen Nadel im Heuhaufen.

Code: Select all

#SingleInstance, Force

;  pos := getPos("543boBo21BoBo9876BoBo",[1,5,3,"bobo"],true)        ; 9130   						(positions of 1/5/3 but non-matching "bobo" (case sensitive: true)
;  pos := getPos("543boBo21BoBo9876BoBo","bobo",,,3)                 ; 18     						(position of the 3rd occurrence (case sensitive: false)
;  pos := getPos("543boBo21BoBo9876BoBO","o",,,0)                    ; 2      						(total number of needle occurrences within the string ('occurrence'-param = 0)
   pos := getPos("543boBo21BoBo9876BoBO",[1,5,3,"bobo","o"],,,0)     ; 1:1/5:1/3:1/bobo:0/o:5		(returning <needle>:<number of occurrences>)

for key, value in pos
    res .= key " : " value "`n"
MsgBox % res


getPos(haystack,needles,case:=false,start:=1,occ:=1) {               ; parameter order identical with AHK's InStr()-function
   if !IsObject(needles)                                             ; if 'needles'-parameter isn't an object but a standard entry...
      needles := [needles]                                           ; so let's push it into that object.
   pos := {}                                                         ; create associative array-object to keep each needles position
   for key, needle in needles                                        ; "für jede nadel im nadelhaufen"
      pos[needle] := (occ=0) 
                  ?  StrSplit(haystack,needle).Count()-1             ; keeping <keyname>:<no of needle occurrences>
                  :  InStr(haystack, needle,case,start,occ)          ; keeping <keyname>:<position>
   Return pos                                                        ; ...within the returned associative "pos"-array.
   }
HTH

8-)
daywalker
Posts: 32
Joined: 18 Jun 2019, 01:37

Re: getPos() - InStr() trifft Array-Object

11 Jul 2023, 04:33

Hier ein Ansatz für eine Steuerung der Groß-/Kleinschreibung über den case -Parameter, gültig auch für 'occurence'-Parameter = '0' :
Ersetze Zeile

Code: Select all

 ?  StrSplit(haystack,needle).Count()-1             ; keeping <keyname>:<no of needle occurrences>
durch

Code: Select all

?  StrSplit(haystack,(case) ? needle: Array(Format("{:U}", needle), Format("{:L}", needle))).Count()-1             ; keeping <keyname>:<no of needle occurrences>

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 110 guests