"Wie oft gibt es diesen String hintereinander in diesem String"-Funktion

  • Hi!


    Teste mal diese Func

    Spoiler anzeigen
    [autoit]

    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

    [/autoit]

    ein bisschen umschreiben und dann hast du was du suchst!


    Lg Kleiner

  • Hey
    Danke für das Skript.
    Hier ist mein abgeändertest Skript:

    Spoiler anzeigen
    [autoit]


    #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

    [/autoit] [autoit][/autoit] [autoit]

    $te=_StringInStr("HeHeheheHeHe","He")
    _ArrayDisplay($te)

    [/autoit]


    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

  • 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

    [/autoit]

    2 Mal editiert, zuletzt von m-obi (10. Oktober 2010 um 00:03)

  • Meine Version 8)

    Spoiler anzeigen
    [autoit]

    $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

    [/autoit]

    Lg, Fabian

    3 Mal editiert, zuletzt von Fabian (10. Oktober 2010 um 01:18)

  • Naja nix = 0. Auch wenn nix zurückgegeben wird ist es 0.
    Siehe hier:

    [autoit]

    $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

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit]
  • Naja nix = 0. Auch wenn nix zurückgegeben wird ist es 0.
    Siehe hier:

    [autoit]

    $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

    [/autoit]

    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

    [/autoit]


    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.

    2 Mal editiert, zuletzt von m-obi (10. Oktober 2010 um 00:21)

  • @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:

    Kleiner

    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

    [/autoit]
  • 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

    [/autoit]


    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.

    Einmal editiert, zuletzt von m-obi (10. Oktober 2010 um 01:08)