Hey
Hier ein Beispiel zu meiner Frage:
___
HeHeHeheheheTestTestTeSt
zu:
3xHe
3xhe
2xTest
1xTeSt
MfG AntiSpeed
Hey
Hier ein Beispiel zu meiner Frage:
___
HeHeHeheheheTestTestTeSt
zu:
3xHe
3xhe
2xTest
1xTeSt
MfG AntiSpeed
Hi!
Teste mal diese Func
Func StringInStr2($str1, $str2)
Dim $x = 1
Dim $Index
Dim $aArray[3]
Dim $Ergebnis = 1
Dim $Fund = StringInStr($str1, $str2, 1, 1, $x)
If Not $Fund Then
$aArray[0] = -1
Return $aArray
EndIf
$Index &= $Fund & '|'
Do
$x = ($Fund + 1)
$Fund = StringInStr($str1, $str2, 1, 1, $x)
If ($Fund <> 0) Then
$Index &= $Fund & '|'
$Ergebnis += 1
EndIf
Until ($Fund = 0)
$aArray[0] = $Ergebnis; wie oft gefunden
$aArray[1] = StringLen($str2) ; übergebene suchstringlänge
$aArray[2] = StringLeft($Index, StringLen($Index) - 1); welche stelle im String
Return $aArray
EndFunc ;==>StringInStr2
ein bisschen umschreiben und dann hast du was du suchst!
Lg Kleiner
Hey
Danke für das Skript.
Hier ist mein abgeändertest Skript:
#include <Array.au3>
Func _StringInStr($str1, $str2)
Local $x = 1
Local $Index
Local $Ergebnis = 1
Dim $aArray[1]
Local $Fund = StringInStr($str1, $str2, 1, 1, $x)
If Not $Fund Then
$aArray[0] = -1
Return $aArray
EndIf
$Index &= $Fund & '|'
Do
$x = ($Fund + 1)
$Fund = StringInStr($str1, $str2, 1, 1, $x)
If ($Fund <> 0) Then
$Index &= $Fund & '|'
$Ergebnis += 1
EndIf
Until ($Fund = 0)
$aArray = StringSplit(StringLeft($Index, StringLen($Index) - 1),"|",3)
Return $aArray
EndFunc
$te=_StringInStr("HeHeheheHeHe","He")
_ArrayDisplay($te)
MfG AntiSpeed
Ich hätte auch noch was, bissl kürzer ;).
[autoit]Global $sText = "HeeeHeeheeHeHeHHee"
[/autoit][autoit][/autoit][autoit]MsgBox(0, "Test", _StringInStrCount($sText, "He"))
[/autoit][autoit][/autoit][autoit]Func _StringInStrCount($sVar, $sSearch)
Local $iCount, $iPos
While 1
$iPos = StringInStr($sVar, $sSearch, 1, 1, $iPos + 1)
If Not $iPos Then Return $iCount
$iCount += 1
WEnd
EndFunc
Meine Version
$sString = "HeHeHeheheheTestTestTeStTest"
[/autoit] [autoit][/autoit] [autoit]MsgBox(0,"","Test wurde "&_StringInStrCount($sString,"Test")&"x hintereinander gefunden")
[/autoit] [autoit][/autoit] [autoit]Func _StringInStrCount($sText,$sMatch, $Casesense = 1)
Local $sPattern = "("&$sMatch&")(?="&$sMatch&")"
If Not $Casesense Then $sPattern = "(?i)"&$sPattern
$aMatch = StringRegExp($sText,$sPattern,3)
If @error Then Return SetError(1,0,0)
Return UBound($aMatch) + 1
EndFunc
Lg, Fabian
Super!
Edit: Na meine ist ja schon von vornerein casesensitiv und trotzdem kürzer.:)
Super!
In deiner Version würde ich $iCount mit 0 initsialisieren, damit bei keinem Treffer die Anzahl 0 zurück gegeben wird
Naja nix = 0. Auch wenn nix zurückgegeben wird ist es 0.
Siehe hier:
$Var = ""
[/autoit][autoit][/autoit][autoit]If $Var = 0 Then MsgBox(0, "Test", "Test")
[/autoit]Edit: Deins noch kürzer
[autoit]Func _StringInStrCount($sText, $sMatch, $iCasesense = 1)
Local $aMatch
If Not $iCasesense Then $sMatch = "(?i)" & $sMatch
[/autoit][autoit][/autoit][autoit]$aMatch = StringRegExp($sText, $sMatch, 3)
If @error Then Return SetError(1, 0, 0)
Return UBound($aMatch)
EndFunc
Naja nix = 0. Auch wenn nix zurückgegeben wird ist es 0.
[autoit]
Siehe hier:$Var = ""
[/autoit] [autoit][/autoit] [autoit]If $Var = 0 Then MsgBox(0, "Test", "Test")
[/autoit]
Ich dachte an das Problem bei einer direkten Ausgabe
[autoit]$sString = "HeHeHeheheheTestTestTeSt"
[/autoit][autoit][/autoit][autoit]MsgBox(0,"","Null wurde "&_StringInStrCount($sString,"Null")&"x hintereinander gefunden")
[/autoit][autoit][/autoit][autoit]Func _StringInStrCount($sVar, $sSearch)
Local $iCount, $iPos
While 1
$iPos = StringInStr($sVar, $sSearch, 1, 1, $iPos + 1)
If Not $iPos Then Return $iCount
$iCount += 1
WEnd
EndFunc
Deshalb $iCount mit 0 initsialisieren
Lg, Fabian
Naja gut hier.
[autoit]Global $sText = "HeeeHeeheeHeHeHHee"
[/autoit][autoit][/autoit][autoit]MsgBox(0, "Test", _StringInStrCount($sText, "He", 1, 3))
[/autoit][autoit][/autoit][autoit]Func _StringInStrCount($sVar, $sSearch, $iCasesense = 0, $iPos = 1)
Local $iCount = 0
While 1
$iPos = StringInStr($sVar, $sSearch, $iCasesense, 1, $iPos) + 1
If Not ($iPos - 1) Then Return $iCount
$iCount += 1
WEnd
EndFunc
Edit: Hab zwei Parameter hinzugeführt wo man Casesensitiv und die Startposition vom Suchen festlegen kann.
Aber trotzdem ist deins eine Zeile kürzer ;). Siehe in meinem Post.
@m-obi musste meine Version verändern, Funktionsfehler entdeckt...
Füttere deine Funktion einmal mit diesem Teststring
[autoit]$sString = "HeHeHeheheheTestTestTeStTestTeSttEst"
[/autoit]
Und du wirst sehen, dass deine Funktion 3 ausgibt, obwohl Test nur zweimal hintereinander vorkommt
Lg, Fabian
Edit:
Deine Funktion gibt auch eine 3 zurück, falls die Funktion mit dem obengenannten Teststring gefüttert wird, stimmt also auch nicht
3 mal ist doch richtig. "HeHeHeheheheTestTestTeStTestTeSttEst"
[autoit]Global $sText = "HeHeHeheheheTestTestTeStTestTeSttEst"
[/autoit][autoit][/autoit][autoit]MsgBox(0, "Test", _StringInStrCount($sText, "Test", 1))
[/autoit][autoit][/autoit][autoit]Func _StringInStrCount($sText, $sSearch, $iCasesense = 0, $iPos = 1)
Local $iCount = 0
While 1
$iPos = StringInStr($sText, $sSearch, $iCasesense, 1, $iPos) + 1
If Not ($iPos - 1) Then Return $iCount
$iCount += 1
WEnd
EndFunc
Der TE wollte aber eine andere Funktion nach seinem Threadnamen
Wie oft gibt es diesen String hintereinander
So jetzt nun aber :).
[autoit]Global $sText = "TestTesttestTestTeSttEst"
[/autoit][autoit][/autoit][autoit]MsgBox(0, "Test", _StringInStrCount($sText, "Test", 1, 1))
[/autoit][autoit][/autoit][autoit]Func _StringInStrCount($sText, $sSearch, $iConsecutive = 0, $iCasesense = 0, $iPos = 1)
Local $iCount = 0, $iLastPos = 1
While 1
$iPos = StringInStr($sText, $sSearch, $iCasesense, 1, $iPos) + 1
If Not ($iPos - 1) Or (($iPos - 1) > ($iLastPos + StringLen($sSearch)) And $iConsecutive) Then Return $iCount
$iCount += 1
$iLastPos = $iPos - 1
WEnd
EndFunc
Edit: Parameter $iConsecutive hinzugefügt. Bestimmt ob der Suchstring hintereinander stehen muss damit alle gefunden werden oder ob der Suchstring verteilt im String vorkommen kann.