Als erstes hat mich sehr erstaunt, wie kompakt ihr alle eure Scripte bekommen habt.
Meine Funktion (zum testen der TestSuite) hatte z.b. über 40 Zeilen!
Andy: 25 Zeilen
BugFix: 22 Zeilen
Oscar: 18 Zeilen
Funkey: 16 Zeilen
Funkey liegt hier mit 16 Zeilen vorne.
Allerdings hat Oscar mit 889 Bytes das schlankere Script erstellt. (Funkey: 1115 Bytes)
Dieser Bytevergleich ist natürlich abhängig von den längen der Variablennamen usw... Aber vergleicht selbst...
Um die Geschwindigkeit zu messen, habe ich die Testsuite 5000 durchlaufen lassen.
Bei diesem Test schlägt nun Bugfix´s Script zu:
Oscar: 11703 ms
Andy: 11402 ms
Funkey: 10349 ms
BugFix: 7796 ms
Ein heißer Kampf um Platz 2, aber Bugfix ist nicht mehr einzuholen
Scripte:
Andy:
Spoiler anzeigen
Func _StringinStrCount($string, $SubString, $bSense = False, $bPartial = False, $sdelim = '', $bReturn = False)
Local $casesense = "(?-i)", $part1 = "", $part2 = "", $treffer = 0 ;würde auch noch in die nächste zeile passen
Dim $retarray1[2] = [1, StringLen($string)], $retarray[1], $aSplit[1] = [$SubString]
If $SubString = "" And $sdelim = "" And $bReturn = False Then Return StringLen($string) ; :o)
If $SubString = "" And $sdelim = "" Then Return $retarray1
If $SubString = "" And $bReturn = False Then Return UBound(StringRegExp($string, "[^(" & $sdelim & ")]", 3))
If $SubString = "" Then
Dim $retarray2[2] = [1, UBound(StringRegExp($string, "[^(" & $sdelim & ")]", 3))]
Return $retarray2
EndIf
If $sdelim <> "" Then Dim $aSplit = StringSplit($SubString, $sdelim, 2) ;wird der Substring mit dem Trennzeichen gesplittet in ein nullbasiertes Array
If $bSense = False Then $casesense = "(?i)"
If $bPartial = False Then ;der suchbegriff muss alleinstehend sein
$part1 = "(?<![\d|\x{041}-\x{0ff}])" ;vornedran dürfen nur zeichen kleiner ascii0x41 sein aber keine zahlen
$part2 = "(?![\d|\x{041}-\x{0ff}])" ;hintendran dürfen nur leerzeichen sein und satzzeichen oder das textende
EndIf
For $i = 0 To UBound($aSplit) - 1 ;Zählschleife für das splitarray von null bis zur anzahl splitstrings
If $bReturn = False Then $treffer += UBound(StringRegExp($string, $casesense & $part1 & "(" & $aSplit[$i] & ")" & $part2, 3))
ReDim $retarray[UBound($retarray) + 1]
$retarray[0] += 1
$retarray[UBound($retarray) - 1] = UBound(StringRegExp($string, $casesense & $part1 & "(" & $aSplit[$i] & ")" & $part2, 3))
Next
If $bReturn = True Then Return $retarray
Return $treffer
EndFunc ;==>_StringinStrCount
BuFix:
Spoiler anzeigen
Func _StringInStrCount($sString, $sSearch='' , $bSens=False, $bPartial=False, $sDelim='', $bReturn=False)
If Not $sSearch And $sDelim Then Return UBound(StringSplit(StringRegExpReplace($sString, $sDelim, ''), '', 2))
If Not $sSearch And Not $sDelim Then Return StringLen($sString)
Local $ret, $Out = '', $indP = 0, $aPat[4][2] = [['(?i)\b','\b'],['\b','\b'],['',''],['(?i)','']]
If $bSens And Not $bPartial Then $indP = 1
If $bSens And $bPartial Then $indP = 2
If Not $bSens And $bPartial Then $indP = 3
If $sSearch And $sDelim Then
Local $split = StringSplit($sSearch, $sDelim, 2), $sum = 0
For $i In $split
$ret = StringRegExp($sString, $aPat[$indP][0] & $i & $aPat[$indP][1], 3)
If IsArray($ret) Then $Out &= UBound($ret) & $sDelim
If IsArray($ret) Then $sum += UBound($ret)
If Not IsArray($ret) Then $Out &= 0 & $sDelim
Next
If $bReturn Then Return StringSplit(StringTrimRight($Out, StringLen($sDelim)), $sDelim)
If Not $bReturn Then Return $sum
EndIf
$ret = StringRegExp($sString, $aPat[$indP][0] & $sSearch & $aPat[$indP][1], 3)
If $bReturn Then Return StringSplit(UBound($ret), ',')
If Not $bReturn Then Return UBound($ret)
EndFunc ; BugFix
Funkey:
Spoiler anzeigen
Func _StringInStrCount($String, $Substring, $bSens = False, $bPartial = False, $sDelim = '', $bRetType = False)
Local $iMatch, $aSplitDelim, $aRet[UBound(StringSplit($Substring, $sDelim, 1))], $bCaseSens = '(?i)', $bPartRegExp = '[ \.,!?\n\r"' & "'" & ']{1}'
If $Substring = '' And $sDelim = '' Then Return StringLen($String)
If $Substring = '' And $sDelim <> '' Then Return StringLen(StringReplace($String, $sDelim, ''))
If $bSens Then $bCaseSens = '(?-i)'
If $bPartial Then $bPartRegExp = ''
If $sDelim = '' Then Return UBound(StringRegExp(' ' & StringRegExpReplace($String, $bPartRegExp, ' ') & ' ', $bCaseSens & $bPartRegExp & $Substring & $bPartRegExp, 3))
$aSplitDelim = StringSplit($Substring, $sDelim, 1)
For $i = 1 To UBound($aSplitDelim) - 1
$iMatch += UBound(StringRegExp(' ' & StringRegExpReplace($String, $bPartRegExp, ' ') & ' ', $bCaseSens & $bPartRegExp & $aSplitDelim[$i] & $bPartRegExp, 3))
$aRet[$i] = $iMatch - $aRet[$i - 1]
Next
$aRet[0] = UBound($aRet) - 1
If $bRetType Then Return $aRet
Return $iMatch
EndFunc
Oscar:
Spoiler anzeigen
Func _StringInStrCount($sString, $sSearch = '', $bSens = False, $bPartial = False, $sDelim = '', $bReturn = False)
If $sSearch = '' Then
$sSearch = '(?s).'
$bPartial = True
EndIf
Local $aSens[2] = ['(?i)', ''], $aPartial[2] = ['\b', ''], $aSearch[2] = [1, $sSearch], $aString[2] = [1, $sString], $iCount = 0
If $sDelim <> '' Then Local $aSearch = StringSplit($sSearch, $sDelim, 1), $aString = StringSplit($sString, $sDelim, 1)
Local $aCount[$aSearch[0] + 1] = [$aSearch[0]]
For $j = 1 To $aString[0]
For $i = 1 To $aSearch[0]
$aString[$j] = StringRegExpReplace($aString[$j], $aSens[$bSens] & $aPartial[$bPartial] & $aSearch[$i] & $aPartial[$bPartial], '')
$aCount[$i] += @extended
$iCount += @extended
Next
Next
If $bReturn Then Return $aCount
Return $iCount
EndFunc
Nun komme ich zu der schwierigen Aufgabe, einen Gewinner zu ernennen.
Programmiertechnisch hat mir eigentlich Oscar´s Script am besten gefallen, welches jedoch beim Geschwindigkeitstest das langsamste ist.
Und da es gerade in einer Sprach wie Autoit manchmal sehr auf Geschwindigkeit ankommt, wähle ich das (mit Abstand) schnellste Script: BUGFIX!
Als Gewinn gibt es ein:
Dann noch vielen Dank an alle Teilnehmer
lgE