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?
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
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
.
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
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.
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é.
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
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.
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
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()
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
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
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
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