web-dev-qa-db-fra.com

comment trouver le nombre d'occurrences d'une sous-chaîne dans une chaîne vb.net

J'ai une chaîne (par exemple: "Hello there. My name is John. I work very hard. Hello there!") et j'essaie de trouver le nombre d'occurrences de la chaîne "hello there". Jusqu'à présent, voici le code que j'ai:

Dim input as String = "Hello there. My name is John. I work very hard. Hello there!"
Dim phrase as String = "hello there"
Dim Occurrences As Integer = 0

If input.toLower.Contains(phrase) = True Then
    Occurrences = input.Split(phrase).Length      
    'REM: Do stuff
End If

Malheureusement, ce que cette ligne de code semble faire est de diviser la chaîne chaque fois qu'elle voit la première lettre de phrase, dans ce cas, h. Donc, au lieu du résultat Occurrences = 2 que j'espère, j'obtiens en fait un nombre beaucoup plus important. Je sais que compter le nombre de divisions dans une chaîne est une façon horrible de procéder, même si j'ai obtenu la bonne réponse, alors quelqu'un pourrait-il m'aider et m'aider?

10
Matt

Vous pouvez créer une boucle Do Until qui s'arrête une fois qu'une variable entière est égale à la longueur de la chaîne que vous vérifiez. Si la phrase existe, incrémentez vos occurrences et ajoutez la longueur de la phrase plus la position dans laquelle elle se trouve à la variable de curseur. Si la phrase est introuvable, vous avez terminé la recherche (plus de résultats), alors définissez-la sur la longueur de la chaîne cible. Pour ne pas compter la même occurrence plus d'une fois, vérifiez uniquement à partir du curseur jusqu'à la longueur de la chaîne cible dans la boucle (strCheckThisString).

    Dim input As String = "hello there. this is a test. hello there hello there!"
    Dim phrase As String = "hello there"
    Dim Occurrences As Integer = 0

    Dim intCursor As Integer = 0
    Do Until intCursor >= input.Length

        Dim strCheckThisString As String = Mid(LCase(input), intCursor + 1, (Len(input) - intCursor))

        Dim intPlaceOfPhrase As Integer = InStr(strCheckThisString, phrase)
        If intPlaceOfPhrase > 0 Then

            Occurrences += 1
            intCursor += (intPlaceOfPhrase + Len(phrase) - 1)

        Else

            intCursor = input.Length

        End If

    Loop
4
N0Alias

Encore une autre idée:

Dim input As String = "Hello there. My name is John. I work very hard. Hello there!"
Dim phrase As String = "Hello there"
Dim Occurrences As Integer = (input.Length - input.Replace(phrase, String.Empty).Length) / phrase.Length

Vous devez juste vous assurer que phrase.Length > 0.

16
Neolisk

la meilleure façon de le faire est la suivante:

Public Function countString(ByVal inputString As String, ByVal stringToBeSearchedInsideTheInputString as String) As Integer
    Return System.Text.RegularExpressions.Regex.Split(inputString, stringToBeSearchedInsideTheInputString).Length -1

End Function
14
Gaucho
str="Thisissumlivinginsumgjhvgsum in the sum bcoz sum ot ih sum"
b= LCase(str)
array1=Split(b,"sum")
l=Ubound(array1)
msgbox l

la sortie vous donne le non. d'occurrences d'une chaîne dans une autre.

4
Sumit Kumar

Une autre solution basée sur la fonction InStr(i, str, substr) (recherche substr dans str à partir de la position i, plus d'informations sur InStr () =):

Function findOccurancesCount(baseString, subString)
    occurancesCount = 0
    i = 1
    Do
        foundPosition = InStr(i, baseString, subString) 'searching from i position
        If foundPosition > 0 Then                       'substring is found at foundPosition index
            occurancesCount = occurancesCount + 1       'count this occurance
            i = foundPosition + 1                       'searching from i+1 on the next cycle
        End If
    Loop While foundPosition <> 0
    findOccurancesCount = occurancesCount
End Function

Dès qu'aucune sous-chaîne n'est trouvée (InStr renvoie 0, au lieu de la position de sous-chaîne trouvée dans la chaîne de base), la recherche est terminée et le nombre d'occurrences est renvoyé.

2
Ivan Gerasimenko

Il vous suffit de changer l'entrée de la fonction fractionnée en un tableau de chaînes, puis de supprimer le StringSplitOptions.

Essayez cette ligne de code:

Occurrences = input.Split({phrase}, StringSplitOptions.None).Length

Je n'ai pas vérifié cela, mais je pense que vous devrez également tenir compte du fait que les occurrences seraient trop élevées en raison du fait que vous vous séparez en utilisant votre chaîne et ne comptez pas réellement le nombre de fois la chaîne, donc je penseOccurrences = Occurrences - 1

J'espère que cela t'aides

2
John Bustos

Vous pouvez créer une fonction récursive à l'aide d'IndexOf. En passant la chaîne à rechercher et la chaîne à localiser, chaque récursivité incrémente un compteur et définit le StartIndex sur +1 au dernier index trouvé, jusqu'à ce que la chaîne de recherche ne soit plus trouvée. La fonction nécessitera des paramètres optionnels Position de départ et compteur transmis par référence:

Function InStrCount(ByVal SourceString As String, _
                    ByVal SearchString As String, _
                    Optional ByRef StartPos As Integer = 0, _
                    Optional ByRef Count As Integer = 0) As Integer
    If SourceString.IndexOf(SearchString, StartPos) > -1 Then
        Count += 1
        InStrCount(SourceString, _
                   SearchString, _
                   SourceString.IndexOf(SearchString, StartPos) + 1, _
                   Count)
    End If
    Return Count
End Function

Appelez la fonction en passant la chaîne à rechercher et la chaîne à localiser et, éventuellement, la position de départ:

Dim input As String = "Hello there. My name is John. I work very hard. Hello there!"
Dim phrase As String = "hello there"
Dim Occurrences As Integer

Occurrances = InStrCount(input.ToLower, phrase.ToLower)

Notez l'utilisation de .ToLower, qui est utilisé pour ignorer la casse dans votre comparaison. N'incluez pas cette directive si vous souhaitez que la comparaison soit spécifique à chaque cas.

2
Jon Wilmer

S'étendant sur la solution simple de Sumit Kumar (veuillez voter sa réponse plutôt que celle-ci), ici, c'est comme une fonction de travail sur une ligne:

Public Function fnStrCnt(ByVal str As String, ByVal substr As String) As Integer
    fnStrCnt = UBound(Split(LCase(str), substr))
End Function

Démo:

Sub testit()
    Dim thePhrase
    thePhrase = "Once upon a midnight dreary while a man was in a house in the usa."
    If fnStrCnt(thePhrase, " a ") > 1 Then
        MsgBox "Found " & fnStrCnt(thePhrase, " a ") & " occurrences."
    End If
End Sub 'testit()
1
cssyphus

En regardant votre tentative d'origine, j'ai trouvé que cela devrait faire l'affaire car "Split" crée un tableau. Occurrences = input.split (phrase) .ubound

Ceci est sensible à CaSe, donc dans votre cas, la phrase doit être égale à "Bonjour là", car il n'y a pas "bonjour là" dans l'entrée

1
NeilR

Je l'ai utilisé dans Vbscript, vous pouvez également le convertir en VB.net

Dim str, strToFind
str = "sdfsdf:sdsdgs::"
strToFind = ":"

MsgBox GetNoOfOccurranceOf( strToFind, str)

Function GetNoOfOccurranceOf(ByVal subStringToFind As String, ByVal strReference As String)
    Dim iTotalLength, newString, iTotalOccCount
    iTotalLength = Len(strReference)
    newString = Replace(strReference, subStringToFind, "")
    iTotalOccCount = iTotalLength - Len(newString)
    GetNoOfOccurranceOf = iTotalOccCount
End Function
0
Maddy

Je ne sais pas si c'est plus évident? À partir du début de longString vérifiez les caractères suivants jusqu'au nombre de caractères dans phrase, si phrase n'est pas trouvé, commencez à chercher à partir du deuxième caractère, etc. S'il est trouvé démarrer agin à partir de la position actuelle plus le nombre de caractères dans phrase et incrémenter la valeur de occurences

 Module Module1
Sub Main()

    Dim longString As String = "Hello there. My name is John. I work very hard. Hello there! Hello therehello there"

    Dim phrase As String = "hello There"


    Dim occurences As Integer = 0
    Dim n As Integer = 0

    Do Until n >= longString.Length - (phrase.Length - 1)
        If longString.ToLower.Substring(n, phrase.Length).Contains(phrase.ToLower) Then
            occurences += 1
            n = n + (phrase.Length - 1)
        End If
        n += 1
    Loop
    Console.WriteLine(occurences)


End Sub
End Module
0
SubtleStu

Je sais que ce fil est vraiment ancien, mais j'ai aussi une autre solution:

Function countOccurencesOf(needle As String, s As String)
    Dim count As Integer = 0
    For i As Integer = 0 to s.Length - 1
        If s.Substring(i).Startswith(needle) Then
            count = count + 1
        End If
    Next
    Return count
End Function
0
Codename