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.
}